Skill: Analyze LinkedIn messages to capture your writing voice
A skill that reads your real LinkedIn conversations and produces a writing voice profile plus templates for openers, replies and follow-ups, ranked by what actually gets answers.
This skill reads your real LinkedIn conversations through Groovin and writes down how you actually write. The result is two files your AI assistant can use every time it drafts a message for you, so drafts sound like you instead of sounding like AI.It only reads. Nothing is sent on LinkedIn, nothing changes in your inbox, and nothing is written to your CRM.
linkedin-writing-voice.md: your greetings, length, punctuation, sign-offs, recurring phrases and the things you never write. Every rule comes with the number of messages that support it.
Message templates
linkedin_msg_templates.md: the structure of your openers, replies and follow-ups, with how often each one got an answer. Names and companies are removed.
Best with an assistant that has a working folder (Claude Cowork, Claude Code): the files are saved there and a later run can reuse the first scan. In a plain chat the skill still works and gives you the two files to download.
Your data. With a working folder, the skill keeps a local file named .linkedin_scan.json so it doesn’t have to read LinkedIn twice. It contains your raw messages and the names of the people you talk to. It stays on your machine: don’t share it or commit it anywhere. The two output files contain no names.
---name: analyze-linkedin-messagesdescription: Analyze the user's real LinkedIn messages to produce a writing voice profile, a library of conversation opener templates ranked by reply rate, a library of reply and follow-up templates ranked by continuation rate, or any combination. Use when the user asks to capture or learn their LinkedIn writing style or tone of voice, build refresh or review their message templates, understand what their outreach or follow-up looks like, or find out which openers, replies, or nudges actually work. Does not draft messages, it produces the files a drafting skill reads. Requires the Groovin connector.---# Analyze LinkedIn messages<!-- Groovin skill | version 2026-10-12 | https://groovin.mintlify.app/mcp/skills -->One scan of the user's LinkedIn conversations, two possible outputs:- **Voice profile**: how this person actually writes. Feeds any drafting skill, on LinkedIn or elsewhere.- **Template library**: `linkedin_msg_templates.md`, opener skeletons ranked by reply rate, plus a reply and follow-up section ranked by continuation rate.This skill does not draft messages. It produces the files a drafting skill reads. The companion skill is `draft-linkedin-message`, but do not assume it is installed.The scan is the slow part and it is shared. Never run it twice in the same session.---## Before you start**Groovin must be connected.** The scan uses the Groovin tools `list_linkedin_conversation_attendees`, `get_linkedin_chat_messages` and `list_linkedin_pending_invitations`. If they are not available, say so and stop: there is nothing to analyze without them.**Work out what your environment gives you, once, and adapt.** Do not ask the user about it.| If you have | Then ||---|---|| A working folder you can read and write | Save the scan cache and the output files there. || No folder (a plain chat) | Skip the cache. Deliver the output files as downloadable files or documents, and tell the user to keep them: project knowledge, a notes tool, anywhere they can hand them back later. || A tool for asking the user structured questions | Use it wherever this skill says "ask". || No such tool | Ask in plain text, one topic at a time, and wait for the answer. |Nothing in this skill sends a LinkedIn message, changes the inbox, or writes to the CRM. Say so if the user asks.---## Reading speed- `list_linkedin_conversation_attendees` and `get_linkedin_chat_messages` carry no LinkedIn limit. Read conversations one after another, no pauses needed.- If one of them returns a 429 or a 5xx, wait briefly and retry once. If it fails again, stop, save what you have, and tell the user to resume later.- `list_linkedin_pending_invitations` is a live LinkedIn read. One call per run, never more.- Never call `get_linkedin_profile`. Extraction does not need it and it is the most limited read LinkedIn allows.### Time estimateOne call per conversation. 100 conversations usually takes a few minutes; long threads take longer to read than short ones. Give the user a rough figure ("a few minutes"), not a precise one.---## Step 1: What are we producingAsk three things before touching the API.**Outputs.** Voice profile only, templates only, or both. Say what each one is for in a line, no more. The template output covers both how you open conversations and how you reply and follow up, say that in the one-liner.**Existing voice profile.** Only if voice is selected. Look for an existing writing style file wherever your environment keeps the user's files: the working folder, project files, or the instructions file (`CLAUDE.md`, project instructions, custom instructions) if it points at one. Common names include `writing-style.md`, `my-writing-style.md`, `voice.md`, `linkedin-writing-voice.md`. If you cannot look, ask whether they have one and to paste it.If you find one, show the user what is in it and ask what to do:- add a LinkedIn section to it, keeping the rest untouched- write a separate LinkedIn-only file and leave the existing one alone- leave it alone entirely and skip the voice outputIf you find nothing, say so and continue. Write a LinkedIn-only file at the end.**Existing templates.** Only if templates are selected. Look for `linkedin_msg_templates.md` the same way. If it exists, do not rebuild silently. Show what is in it and ask whether to refresh, add to it, or leave it alone. This applies to the whole file, openers and reply/follow-up sections together, unless the user says to touch only one.**AI drafting.** Only if voice is selected. Ask plainly: do they use an AI tool to write LinkedIn messages, and roughly since when. If yes, note the date. Messages after it are suspect, and the flagging pass in Step 6 gets stricter. This matters because a profile built on AI-drafted messages captures the AI's voice and then locks it in permanently.## Step 2: Cache checkOnly when you have a working folder. Otherwise skip to Step 3.Look for `.linkedin_scan.json` in the working folder.If it exists and covers the requested depth, reuse it. Say so: "I already have 100 conversations from 12 March. I can build the voice profile from those without reading LinkedIn again, or rescan for fresher data."Older than about 6 weeks, mention the age and recommend a rescan.If it covers fewer conversations than requested, fetch only the gap.If an older cache has no `preceding_message` field (see Step 5), treat it as missing reply/follow-up data even though openers and voice are fine. Say so and offer to fetch just those conversations again rather than a full rescan.## Step 3: ScopeCall `list_linkedin_conversation_attendees` once with `limit: 300`. This returns the 300 most recent conversations, most recent first, with their conversation details. Do not fetch the whole inbox: a large one is thousands of people.Clean the list before anything else:- Keep attendees that have a `conversation_id`.- Drop `conversation_type: "SPONSORED"`. Those are ads, not conversations.- Note `conversation_type: "INMAIL"`. InMail is its own format (see Step 5).- **De-duplicate by `conversation_id`.** A group chat appears once per member. Keep one entry and mark it `is_group: true`.**Audience focus.** Summarize the headline and occupation spread, then ask whether to analyze everyone or focus on one audience. Filtering on `headline` costs nothing and gives a cleaner sample. Describe the groups in the user's own world, whatever it is: "Most of your recent conversations are with founders (41), investors (28), and candidates (12). Analyze all, or focus on one?"If the user picks one audience and the 300 do not hold enough of it, say so and offer to call again with a higher `limit`.**Depth.** Default is the latest 100 conversations. Offer a faster 30.Note if asked: voice stabilizes around 40 to 60 substantive messages, which 30 conversations usually clears. Reply-rate and continuation-rate comparison between clusters needs 100 or it is ranking noise. So templates-only and both should lean 100, voice-only can go either way.## Step 4: Confirm before launchingDo not start fetching until the user has confirmed. State plainly:- how many conversations- the rough time- whether progress is saved as you go (only with a working folder)- what will be written at the endExample:> 100 conversations, a few minutes. I only read: nothing is sent and nothing changes in your inbox or CRM. At the end you get a voice profile and a template library covering openers, replies, and follow-ups. Go ahead?Wait for a yes.## Step 5: Fetch### Pending invitationsOne call, `list_linkedin_pending_invitations`:~~~direction: "sent"sent_after: {start of the conversation sample's date range}sent_before: {today}limit: 100~~~These are invites the user sent that have not been accepted. Each carries the invitation `message`, `headline`, and `sent_at`.Do not narrow `sent_before` at the API. Fetch everything back to the start of the sample and apply the 7 day cutoff locally when computing ignored counts. An invite still pending after a week is very unlikely to be accepted; anything more recent tells you nothing because the person may not have looked yet. But the notes themselves are user-written text and belong in the voice corpus regardless of age.Skip invites sent with no note.The response reports `total_matched` and `truncated`. Remember whether it was truncated.### ConversationsWith a working folder: write `.linkedin_scan.json` and append after every single conversation, so an interruption loses nothing. On a re-run, read it first and skip what is already there. Tell the user once that this file holds their raw messages and the names of the people they talk to: it stays on their machine and should not be shared or committed anywhere.Without a folder: keep the records in the conversation. Say that a later session will have to scan again.For each conversation, `get_linkedin_chat_messages` with `limit: 100`.Sort the returned page by timestamp ascending. Do not assume the API returns oldest first. Ignore messages flagged as deleted.Record per conversation:~~~conversation_id, name, headline, occupation, network_distance,conversation_type, is_group,has_cursor, total_messages,first_message_text, first_message_type, first_message_sent_by_me,first_message_at, got_reply, reply_latency_hours,my_messages: [ {text, message_type, position, sent_at, language, preceding_message} ]~~~`my_messages` is every message with `sent_by_me: true`, not just the first. This is the voice corpus and it is already in the response. `position` is 1 for the conversation's first message and 2+ for anything after it.`language` is the language the message is written in. Many people write LinkedIn messages in two languages; Step 6 needs to keep them apart.`preceding_message` is the single message immediately before this one in the full thread, taken from the same page you already fetched: `{text, sent_by_me, sent_at}`, or `null` if this message is the conversation's first (position 1). It costs no extra call. It is what lets Step 7 tell a reply apart from a nudge:- `preceding_message.sent_by_me` is `false`: this message replies to something they said. Their text is the trigger.- `preceding_message.sent_by_me` is `true`: this message follows up on your own message that got no reply in between. A nudge.`got_reply` is true when any message after the user's first has `sent_by_me: false`.**Format.** Every opener has one of three formats, and they must never be clustered together:- `invite_note`: when a connection request is accepted, the invitation note appears as the first message. Use `message_type` to tell it apart from a normal message. Capped at 300 characters.- `inmail`: `conversation_type` is `INMAIL`. Sent to someone outside the user's network, usually with a subject line.- `dm`: everything else.**Group chats.** If `is_group` is true, or the thread has more than one other sender, keep `my_messages` for the voice corpus and exclude the conversation from all template statistics. A reply in a group is not a reply to an opener.**Conversations returning a cursor.** A thread over 100 messages is a relationship, not templated outreach. Do not page it, and exclude it from template clustering, openers or replies alike. But keep its `my_messages` for the voice corpus. Long threads are the richest voice material in the sample.Progress: one line per 20 conversations, not per conversation.**Do not delete `.linkedin_scan.json` at the end.** It is what makes a later run instant.---## Step 6: Voice extractionSkip if voice was not selected.### CorpusEvery `my_messages` entry from every conversation including cursor ones and group chats, plus every pending invite note.Drop before analyzing: quoted text, signature blocks, bare links, and one-word acknowledgements ("thanks", "sure", "ok", "great", and their equivalents in other languages). They inflate the count without adding signal. Report the real number: "312 messages, 247 substantive."Under 15 substantive messages, stop. Say so and offer to widen. Do not build a profile from a handful of examples.### LanguagesCount substantive messages per language and say what you found: "212 in English, 96 in German."- A language with 15 or more substantive messages gets its own rule set. Extract it separately. Do not blend languages: greetings, length, punctuation and formality differ.- A language under 15 is listed under Low confidence with whatever is observable, and no rules.- Where the language has a formal and an informal address (du/Sie, tu/vous, tú/usted), record which one the user uses, with whom, and with counts. This is the rule a drafting skill most needs and most often gets wrong.- Note what decides the language, if the sample shows it: the other person's language, their country, who wrote first.A single-language corpus skips all of this silently.### Contamination flaggingBefore extracting anything, look for messages that were probably not written by the user.Tells, in rough order of reliability:- near-identical structure repeated across many messages that are not obviously a deliberate template- punctuation and capitalisation noticeably cleaner than the surrounding corpus- em dashes clustered in a subset while absent everywhere else- sudden uniformity in length after a date- sent in tight bursts at machine speedIf the user named a date in Step 1, weight anything after it more heavily.Show the flagged set, grouped, with counts. Let the user exclude before the profile is written. Do not exclude anything silently.### MarkingEvery rule is labelled with where it holds:- `opener` (position 1 DMs)- `reply` (position 2+)- `invite_note` (capped at 300 characters, always cold)- `inmail` (only if the sample has enough of them)A rule holding in more than one bucket is stronger than one holding in a single bucket. Say which.This matters most for length and structure. An invite note is constrained to 300 characters, so any length rule derived from it is wrong applied to a DM. Never let invite note rules leak into DM guidance.### What to extract- **Mechanics**: length distribution, greeting forms, sign-offs, capitalisation, punctuation (including whether they actually use em dashes), emoji, contractions, link habits, line breaks and paragraphing.- **Structure**: how they open, how they make an ask, how they close, whether they front-load or bury the point.- **Lexicon**: recurring phrases, filler they do use, words and constructions they never use.- **Register shifts**: differences by `network_distance` or audience, but only if the sample actually supports it. Do not invent a split from four messages.Every rule carries the count supporting it. Absolute numbers, never a bare percentage.### Preserving voiceDocument how this person writes, do not improve it. Lowercase stays lowercase. Missing punctuation stays missing. Blunt stays blunt. Typos they repeat are a habit, not an error. Do not add em dashes and do not add "I hope this finds you well."If the profile reads like advice, it is wrong. It is a description.## Step 7: Template extractionSkip if templates were not selected.This step covers two different things: how the user opens conversations, and how they reply or follow up once one is underway. They get different treatment because they answer different questions and use different metrics. Do not blend them into one comparison.### OpenersKeep conversations where the earliest message has `sent_by_me: true`, `has_cursor` is false and `is_group` is false.Report the yield plainly: "58 of 100 were started by you."Under 15 usable, say so and offer to widen the sample. Do not invent patterns from four examples. Some people mostly receive messages rather than send them; for them, "too few openers to template" is the honest result, and the reply section below may still be worth building.**Cluster**Split first by format (`invite_note`, `inmail` or `dm`), then by language if the user writes openers in more than one, then by intent.Let the intents come from the messages. These are common ones, to start from, not a list to force the data into:- Cold open, no prior context- Reaction to a signal: funding, job change, a post, a launch, hiring- Warm intro via a mutual, an event, or shared content- Follow-up right after a connection was accepted- Re-engagement after silenceName each cluster after what the user is actually doing. A recruiter's "candidate approach", an investor's "founder sourcing" or "intro request", a founder's "customer check-in" are better names than a generic label, and the user will recognise them.Cross-cut by audience from `headline`.For each cluster of 3 or more, extract:- **Skeleton**: the move sequence. Opener, why now, relevance, ask, close.- **Variables**, using the vocabulary below.- **Length** range in words.- **Reply rate**: replies over sends, always with absolute counts, never a bare percentage.- **Ignored count**, for invite note clusters: how many of this variant are still pending 7 or more days after sending.### Reply and follow-up movesLook at every `my_messages` entry at position 2 or higher, from conversations where `has_cursor` is false and `is_group` is false (keep the others for voice, exclude them from template clustering).Use `preceding_message` to split into two kinds before clustering either one:- **Replies**, where `preceding_message.sent_by_me` is `false`. The trigger is what they said. Group by what that inbound message was doing (asking about pricing, expressing interest, pushing back, asking a logistics question, going quiet then resurfacing) and let the clusters emerge from what the data actually shows. Reply triggers vary too much from one user to the next to predefine.- **Nudges**, where `preceding_message.sent_by_me` is `true`. This is a follow-up on the user's own message that never got a reply. Cluster these on their own, separate from replies, since the trigger is silence rather than something said.Nudges get their own bucket at a lower bar than the rest of this step: 3 examples is enough to report, because a silence follow-up pattern is worth surfacing even when thin, and the low-confidence flag already covers under 5. Do not fold nudges into a reply cluster just because the count is small.For each cluster of 3 or more, extract:- **Skeleton**: the move sequence.- **Variables**, using the vocabulary below.- **Trigger**: for replies, a short generic description of what prompted it (described rather than quoted, since real text gets scrubbed at Save anyway). For nudges, the typical gap: how many days after the unanswered message this was usually sent.- **Length** range in words.- **Continuation rate**: of this move, how many led to another reply from them. Absolute counts. This is a different measurement from opener reply rate and must not be merged into the same table or ranked against it.- For nudges specifically, also report how many eventually got a reply at all versus never did.Do not restate voice rules in either section. They live in the voice profile. If templates were built without voice, keep a short voice note in the template file so it still stands alone.### The comparisonThis is the headline finding and it goes above the templates. Users care more about which approach works than about any single template.For openers: compare clusters against each other on reply rate, with counts. For example: signal reaction 18/44 replied, cold open 6/51 replied. Say what the difference suggests and what it does not prove.For replies and follow-ups: compare separately, on continuation rate, with counts. State plainly that this is a different metric measuring a different thing, not a second ranking of the same list. Call out the nudge finding specifically since it is usually the most actionable one: what share of unanswered threads got revived, and roughly how long after silence a nudge stops paying off if the data shows a cliff.Where sample sizes are small, say so rather than ranking on noise. Under 5 sends is directional at best.For invite notes, report reply rate alongside the ignored count. Do not compute a single acceptance percentage. Accepted invites whose conversation fell outside the sample are invisible, which biases any such number downward, and the pending list is capped at 100. Two honest numbers beat one fake-precise one. If the invitations response came back truncated, say so: ignored counts are a floor rather than a total.### Variable vocabularyOnly use these slots. They are named after the data source that fills them, so the drafting skill knows where to look.~~~{first_name} {company} {role} profile{mutual_connection} {shared_group} network{trigger_event} funding, job change, post, launch, hiring{shared_context} event, content, prior meeting{last_touchpoint} {last_call_topic} CRM, email, call transcripts{their_question} {their_objection} reply triggers, from the inbound message{my_ask} {cta} the user's intent~~~If a cluster genuinely needs a slot outside this list, name it after what would fill it. Never emit a vague slot like `{something_relevant}`. The drafting skill cannot fill what it cannot identify.## Step 8: ReviewAsk, one topic at a time.**Voice**: present the 6 or so strongest rules, each with its count and where it holds. Confirm, correct, or drop. A user who says "actually I never do that" is giving you better data than the sample.**Opener templates**: at most 6 candidates, best reply rate first. For each: name, reply rate with counts, skeleton, one anonymized example. Keep, merge, or drop.**Reply and follow-up templates**: at most 4 candidates, best continuation rate first, but always include the strongest nudge cluster regardless of where it ranks, since silence follow-ups are the ones most likely to get buried under higher-continuation reply clusters. For each: name, whether it is a reply or a nudge, continuation rate with counts, skeleton, one anonymized example. Keep, merge, or drop.Do not dump everything in one wall of text.## Step 9: Save**Scrub first.** Every real name, company, and identifying detail becomes a variable slot or a placeholder. Zero names of other people in either file.**Extract structure, not text.** Verbatim messages get sent verbatim and read like a bot. The value is the skeleton plus the rules.**Where.** In the working folder root when there is one. Otherwise as downloadable files or documents, with one line telling the user to keep them where their AI tool can read them next time.### Voice profileEither a new `linkedin-writing-voice.md`, or a LinkedIn section appended to the existing file, per the Step 1 answer.~~~markdown# LinkedIn writing voice<!-- generated {date} | {N} substantive messages from {C} conversations + {I} invite notes | {date range} -->## Core voiceThree or four sentences describing how this person writes. Plain description.## LanguagesWhich languages, with message counts, and what decides which one is used.Omit this section for a single-language profile.## RulesOne table per language when there are several.| Rule | Holds in | Evidence ||---|---|---|| lowercase greeting, no comma | openers, replies | 61 of 74 || no sign-off on replies | replies | 88 of 91 |## Formal or informal addressOnly for languages that have the distinction. Which form, with whom, with counts.## Invite notesRules that apply only to the 300 character format. Do not apply these to DMs.## Register shiftsDifferences by audience, only where the sample supports it. Otherwise say there isno evidence of a shift.## Never doesObserved anti-patterns with counts. Things absent from the corpus.## Anti-slop list (generic, edit freely)Not derived from your messages. These are common AI tells in English. Deleteanything you disagree with, add your own, including for your other languages.- "I hope this finds you well" and any variant- "I wanted to reach out"- "It's not just X, it's Y" and the same shape as a two-sentence fragment- Tricolons everywhere. Three-item lists as a default rhythm.- "delve", "leverage", "unlock", "game-changer", "revolutionize"- Rhetorical question as an opener- Enthusiasm by exclamation mark- "As someone who..."- Closing by restating the opening- Em dashes. Common tell, but genuinely used by some people. The Rules table above says whether you use them. Trust that over this line.## Low confidenceUnder 10 messages supporting. Directional only.~~~### Template library`linkedin_msg_templates.md`. The shape is fixed because it is the interface to the drafting skill:~~~markdown# LinkedIn message templates<!-- generated {date} | {N} conversations, {M} pending invites | {date range} -->## What works: openers| Approach | Format | Sends | Replies | Rate | Confidence |One paragraph on what the comparison suggests.## VoiceSee linkedin-writing-voice.md. (Or, if voice was not extracted, a shortvoice note derived from the same messages so this file stands alone.)## Opener templates### O1. {name}- **Format:** invite_note | inmail | dm- **Language:** {language}- **Use when:** {the matching condition, written for the drafting skill}- **Sends / replies:** 12 / 5- **Skeleton:** ...- **Variables:** {first_name}, {trigger_event}- **Example:** ...## What works: replies and follow-ups| Approach | Kind | Instances | Continued | Rate | Confidence |One paragraph on what the comparison suggests, including the nudge finding(share of unanswered threads revived, and the point where nudging stops paying offif the data shows one).## Reply and follow-up templates### R1. {name}- **Kind:** reply | nudge- **Language:** {language}- **Use when:** {the matching condition: what the inbound message was doing, or how long the thread had gone quiet}- **Instances / continued:** 9 / 4- **Skeleton:** ...- **Variables:** {their_objection}, {last_touchpoint}- **Example:** ...## Anti-patternsThings this user never does. Do not reintroduce them.## Low confidenceOpeners under 5 sends, replies and nudges under 5 instances. Directional only.~~~Every template needs an explicit **Use when**. That is how the drafting skill selects one instead of guessing.## Step 10: Check itOnly when a voice profile was written.Hold back five real messages from the corpus, spread across the languages in the profile. For each, write a one-line brief describing what it was doing, then draft a replacement from the profile alone without looking at the original. Show both side by side.Ask whether the drafts sound like them. Where they miss, ask what is off and fix the profile. A style file nobody trusts gets ignored.## Step 11: Wire it upThe files are inert until something tells the assistant to read them. Offer both hooks, once each, and do not push.**A pointer in their instructions.** One or two lines, wherever this environment keeps standing instructions (`CLAUDE.md`, project instructions, custom instructions):> When drafting LinkedIn messages, read linkedin_msg_templates.md and linkedin-writing-voice.md first. This covers openers, replies, and follow-ups.A pointer, not the content, so it costs a line of context rather than the whole library. In a tool with no file access, the equivalent is adding the two files to the project's knowledge.**Drafting skills.** If you can list the user's installed skills, pick out any that write outreach, messages, sequences, or follow-ups, and ask which should reference these files. If you are able to edit skills, offer to add the line yourself. The Groovin companion skill `draft-linkedin-message` already reads both files by these names: if it is installed, say the two are ready to be used together; if it is not, mention it exists and leave it there.Then close with two offers, once each:- If invite notes were thin in the sample, offer to take pasted examples.- If a voice profile was built, note that LinkedIn is one channel and their sent email would deepen it, particularly for anything longer than a DM. Leave it with them.---## Failure handling- **429 or 5xx on a chat read**: wait briefly, retry once. If it fails again, stop, save state when you can, and tell the user to pick it up later.- **Every Groovin call failing, including after it was working**: the connection has expired. Tell the user to reconnect Groovin in their connector settings. Do not retry, do not speculate about account restrictions.- **A result that starts with "Groovin connector problem"**: relay it and follow what it says.- **Under 15 usable conversations, or under 15 substantive messages**: say it. Offer to widen. Do not present four examples as a pattern.- **No clear clusters**: say the messages are too varied to template. That is a finding, not a failure to cover up. This applies separately to openers and to replies/follow-ups; one can cluster cleanly while the other does not.- **Corpus mostly AI-drafted**: say so and stop. A profile built on it would be worse than no profile, because it would be trusted. Offer to work from whatever predates the tool, or from pasted examples they know they wrote.
Version 2026-10-12. Skills are plain text: adapt this one to how you work. When a new version is published here, replace your copy.
⌘I
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Groovin","colors":{"primary":"#f37546","light":"#d64baf","dark":"#040404"},"logo":{"light":"https://media.brand.dev/8a452a89-9e16-46a4-97fb-c1afa22cee62.svg","dark":"https://media.brand.dev/8a452a89-9e16-46a4-97fb-c1afa22cee62.svg"},"favicon":"https://media.brand.dev/f810fcbb-2382-4110-80c2-f249d1f9f172.png","api":{"playground":{"display":"interactive","proxy":false}},"navbar":{"links":[],"primary":{"type":"button","label":"Get Started","href":"https://groovin.ai"}},"fonts":{"heading":{"family":"Inter","weight":900},"body":{"family":"Inter","weight":400}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"groovin","hasAudioNarration":false,"actualSubdomain":"groovin","customDomains":["docs.groovin.ai"],"gitSource":{"type":"github","owner":"groovin-ai","repo":"groovin-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":"","_id":"6aec7b9eb09eb89604ce751a"},"chroma":{"collectionId":"41f6a9c9-9aa7-4679-be30-d451733c6add","liveDeploymentHistoryId":"6aec7eae252b547dce084185","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aec7eae252b547dce084185"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aecaa4b8029e5fb8e3f0b21","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"default","tag":"MCP Server","count":9},{"language":"default","tag":"Get Started","count":3},{"language":"default","tag":"Skills","count":3},{"language":"default","tag":"Use Cases","count":2},{"language":"default","tag":"Help","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"mcp/skills/analyze-linkedin-messages","slug":"/mcp/skills/analyze-linkedin-messages","pageMetadata":{"title":"Skill: Analyze LinkedIn messages to capture your writing voice","sidebarTitle":"Analyze LinkedIn messages","description":"A skill that reads your real LinkedIn conversations and produces a writing voice profile plus templates for openers, replies and follow-ups, ranked by what actually gets answers.","href":"/mcp/skills/analyze-linkedin-messages"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"A skill that reads your real LinkedIn conversations and produces a writing voice profile plus templates for openers, replies and follow-ups, ranked by what actually gets answers.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,Card,CardGroup,CodeBlock,Heading,Note}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This skill reads your real LinkedIn conversations through Groovin and writes down how you actually write. The result is two files your AI assistant can use every time it drafts a message for you, so drafts sound like you instead of sounding like AI.`}),`\n`,_jsx(_components.p,{children:`It only reads. Nothing is sent on LinkedIn, nothing changes in your inbox, and nothing is written to your CRM.`}),`\n`,_jsx(Heading,{level:`2`,id:`what-you-get`,children:`What you get`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Voice profile`,icon:`pen-nib`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`linkedin-writing-voice.md`}),`: your greetings, length, punctuation, sign-offs, recurring phrases and the things you never write. Every rule comes with the number of messages that support it.`]})}),_jsx(Card,{title:`Message templates`,icon:`layer-group`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`linkedin_msg_templates.md`}),`: the structure of your openers, replies and follow-ups, with how often each one got an answer. Names and companies are removed.`]})})]}),`\n`,_jsx(_components.p,{children:`You can ask for one, the other, or both.`}),`\n`,_jsx(Heading,{level:`2`,id:`how-it-works`,children:`How it works`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`You choose`}),` what to produce and how many conversations to analyze (100 by default, 30 for a quicker run).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It reads`}),` your most recent conversations and the connection notes you sent. Count a few minutes for 100 conversations.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It flags`}),` messages that look AI-written, so they don’t end up defining your voice. You decide what to exclude.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It shows you`}),` the strongest rules and templates, and you confirm, correct or drop each one.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It tests itself`}),`: it redrafts five of your real messages from the profile alone and asks whether they sound like you.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It saves`}),` the files and offers to connect them to your drafting setup.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`It adapts to how you use LinkedIn:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Several languages.`}),` If you write in more than one language, each gets its own rules, including formal or informal address (du/Sie, tu/vous).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Any role.`}),` Template categories come from your own messages, whether you’re selling, sourcing founders, recruiting or raising.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Any audience.`}),` You can focus the analysis on one group, such as founders or investors.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-start`,children:`Before you start`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Groovin MCP connected to your AI assistant. See `,_jsx(_components.a,{href:`/mcp/setup`,children:`Setup`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The skill installed. See `,_jsx(_components.a,{href:`/mcp/skills#how-to-install-a-skill`,children:`how to install a skill`}),`.`]}),`\n`,_jsx(_components.li,{children:`Best with an assistant that has a working folder (Claude Cowork, Claude Code): the files are saved there and a later run can reuse the first scan. In a plain chat the skill still works and gives you the two files to download.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-to-use-it`,children:`How to use it`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Analyze my LinkedIn messages and capture my writing voice.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Build my LinkedIn message templates and tell me which openers actually get replies.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Once the files exist, use `,_jsx(_components.a,{href:`/mcp/skills/draft-linkedin-message`,children:`Draft a LinkedIn message`}),` to write with them.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Your data.`}),` With a working folder, the skill keeps a local file named `,_jsx(_components.code,{children:`.linkedin_scan.json`}),` so it doesn’t have to read LinkedIn twice. It contains your raw messages and the names of the people you talk to. It stays on your machine: don’t share it or commit it anywhere. The two output files contain no names.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`the-skill`,children:`The skill`}),`\n`,_jsxs(_components.p,{children:[`Copy the text below and install it as explained in `,_jsx(_components.a,{href:`/mcp/skills#how-to-install-a-skill`,children:`how to install a skill`}),`.`]}),`\n`,_jsx(Accordion,{title:`analyze-linkedin-messages — SKILL.md (version 2026-10-12)`,id:`analyze-linkedin-messages-skill-md-version-2026-10-12`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`509`,language:`markdown`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`markdown`,children:_jsxs(_components.code,{language:`markdown`,numberOfLines:`509`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`---`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`analyze-linkedin-messages`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`description`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Analyze the user's real LinkedIn messages to produce a writing voice profile, a library of conversation opener templates ranked by reply rate, a library of reply and follow-up templates ranked by continuation rate, or any combination. Use when the user asks to capture or learn their LinkedIn writing style or tone of voice, build refresh or review their message templates, understand what their outreach or follow-up looks like, or find out which openers, replies, or nudges actually work. Does not draft messages, it produces the files a drafting skill reads. Requires the Groovin connector.`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`---`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`# Analyze LinkedIn messages`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`\u003c!-- Groovin skill | version 2026-10-12 | https://groovin.mintlify.app/mcp/skills -->`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`One scan of the user's LinkedIn conversations, two possible outputs:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Voice profile**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: how this person actually writes. Feeds any drafting skill, on LinkedIn or elsewhere.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Template library**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`linkedin_msg_templates.md`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, opener skeletons ranked by reply rate, plus a reply and follow-up section ranked by continuation rate.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`This skill does not draft messages. It produces the files a drafting skill reads. The companion skill is `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`draft-linkedin-message`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, but do not assume it is installed.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`The scan is the slow part and it is shared. Never run it twice in the same session.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`---`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Before you start`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Groovin must be connected.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` The scan uses the Groovin tools `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`list_linkedin_conversation_attendees`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`get_linkedin_chat_messages`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` and `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`list_linkedin_pending_invitations`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. If they are not available, say so and stop: there is nothing to analyze without them.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Work out what your environment gives you, once, and adapt.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Do not ask the user about it.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`| If you have | Then |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`|---|---|`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`| A working folder you can read and write | Save the scan cache and the output files there. |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`| No folder (a plain chat) | Skip the cache. Deliver the output files as downloadable files or documents, and tell the user to keep them: project knowledge, a notes tool, anywhere they can hand them back later. |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`| A tool for asking the user structured questions | Use it wherever this skill says \"ask\". |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`| No such tool | Ask in plain text, one topic at a time, and wait for the answer. |`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Nothing in this skill sends a LinkedIn message, changes the inbox, or writes to the CRM. Say so if the user asks.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`---`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Reading speed`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `list_linkedin_conversation_attendees`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` and `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`get_linkedin_chat_messages`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` carry no LinkedIn limit. Read conversations one after another, no pauses needed.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` If one of them returns a 429 or a 5xx, wait briefly and retry once. If it fails again, stop, save what you have, and tell the user to resume later.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `list_linkedin_pending_invitations`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is a live LinkedIn read. One call per run, never more.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Never call `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`get_linkedin_profile`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. Extraction does not need it and it is the most limited read LinkedIn allows.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Time estimate`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`One call per conversation. 100 conversations usually takes a few minutes; long threads take longer to read than short ones. Give the user a rough figure (\"a few minutes\"), not a precise one.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`---`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 1: What are we producing`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Ask three things before touching the API.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Outputs.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Voice profile only, templates only, or both. Say what each one is for in a line, no more. The template output covers both how you open conversations and how you reply and follow up, say that in the one-liner.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Existing voice profile.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Only if voice is selected. Look for an existing writing style file wherever your environment keeps the user's files: the working folder, project files, or the instructions file (`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`CLAUDE.md`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, project instructions, custom instructions) if it points at one. Common names include `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`writing-style.md`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`my-writing-style.md`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`voice.md`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`linkedin-writing-voice.md`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. If you cannot look, ask whether they have one and to paste it.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`If you find one, show the user what is in it and ask what to do:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` add a LinkedIn section to it, keeping the rest untouched`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` write a separate LinkedIn-only file and leave the existing one alone`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` leave it alone entirely and skip the voice output`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`If you find nothing, say so and continue. Write a LinkedIn-only file at the end.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Existing templates.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Only if templates are selected. Look for `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`linkedin_msg_templates.md`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` the same way. If it exists, do not rebuild silently. Show what is in it and ask whether to refresh, add to it, or leave it alone. This applies to the whole file, openers and reply/follow-up sections together, unless the user says to touch only one.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**AI drafting.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Only if voice is selected. Ask plainly: do they use an AI tool to write LinkedIn messages, and roughly since when. If yes, note the date. Messages after it are suspect, and the flagging pass in Step 6 gets stricter. This matters because a profile built on AI-drafted messages captures the AI's voice and then locks it in permanently.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 2: Cache check`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Only when you have a working folder. Otherwise skip to Step 3.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Look for `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`.linkedin_scan.json`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` in the working folder.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`If it exists and covers the requested depth, reuse it. Say so: \"I already have 100 conversations from 12 March. I can build the voice profile from those without reading LinkedIn again, or rescan for fresher data.\"`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Older than about 6 weeks, mention the age and recommend a rescan.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`If it covers fewer conversations than requested, fetch only the gap.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`If an older cache has no `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`preceding_message`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` field (see Step 5), treat it as missing reply/follow-up data even though openers and voice are fine. Say so and offer to fetch just those conversations again rather than a full rescan.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 3: Scope`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Call `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`list_linkedin_conversation_attendees`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` once with `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`limit: 300`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. This returns the 300 most recent conversations, most recent first, with their conversation details. Do not fetch the whole inbox: a large one is thousands of people.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Clean the list before anything else:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Keep attendees that have a `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`conversation_id`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Drop `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:'`conversation_type: \"SPONSORED\"`'}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. Those are ads, not conversations.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Note `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:'`conversation_type: \"INMAIL\"`'}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. InMail is its own format (see Step 5).`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **De-duplicate by `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#CE9178`,\"--shiki-dark-font-weight\":`bold`},children:\"`conversation_id`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` A group chat appears once per member. Keep one entry and mark it `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`is_group: true`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Audience focus.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Summarize the headline and occupation spread, then ask whether to analyze everyone or focus on one audience. Filtering on `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`headline`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` costs nothing and gives a cleaner sample. Describe the groups in the user's own world, whatever it is: \"Most of your recent conversations are with founders (41), investors (28), and candidates (12). Analyze all, or focus on one?\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`If the user picks one audience and the 300 do not hold enough of it, say so and offer to call again with a higher `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`limit`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Depth.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Default is the latest 100 conversations. Offer a faster 30.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Note if asked: voice stabilizes around 40 to 60 substantive messages, which 30 conversations usually clears. Reply-rate and continuation-rate comparison between clusters needs 100 or it is ranking noise. So templates-only and both should lean 100, voice-only can go either way.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 4: Confirm before launching`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Do not start fetching until the user has confirmed. State plainly:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` how many conversations`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` the rough time`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` whether progress is saved as you go (only with a working folder)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` what will be written at the end`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Example:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#6A9955`},children:`>`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#D4D4D4`},children:` 100 conversations, a few minutes. I only read: nothing is sent and nothing changes in your inbox or CRM. At the end you get a voice profile and a template library covering openers, replies, and follow-ups. Go ahead?`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Wait for a yes.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 5: Fetch`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Pending invitations`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`One call, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`list_linkedin_pending_invitations`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`~~~`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`direction: \"sent\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`sent_after: {start of the conversation sample's date range}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`sent_before: {today}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`limit: 100`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`~~~`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`These are invites the user sent that have not been accepted. Each carries the invitation `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`message`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`headline`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, and `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`sent_at`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Do not narrow `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`sent_before`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` at the API. Fetch everything back to the start of the sample and apply the 7 day cutoff locally when computing ignored counts. An invite still pending after a week is very unlikely to be accepted; anything more recent tells you nothing because the person may not have looked yet. But the notes themselves are user-written text and belong in the voice corpus regardless of age.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Skip invites sent with no note.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`The response reports `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`total_matched`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` and `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`truncated`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. Remember whether it was truncated.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Conversations`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`With a working folder: write `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`.linkedin_scan.json`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` and append after every single conversation, so an interruption loses nothing. On a re-run, read it first and skip what is already there. Tell the user once that this file holds their raw messages and the names of the people they talk to: it stays on their machine and should not be shared or committed anywhere.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Without a folder: keep the records in the conversation. Say that a later session will have to scan again.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`For each conversation, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`get_linkedin_chat_messages`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` with `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`limit: 100`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Sort the returned page by timestamp ascending. Do not assume the API returns oldest first. Ignore messages flagged as deleted.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Record per conversation:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`~~~`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`conversation_id, name, headline, occupation, network_distance,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`conversation_type, is_group,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`has_cursor, total_messages,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`first_message_text, first_message_type, first_message_sent_by_me,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`first_message_at, got_reply, reply_latency_hours,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`my_messages: [ {text, message_type, position, sent_at, language, preceding_message} ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`~~~`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`my_messages`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is every message with `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`sent_by_me: true`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, not just the first. This is the voice corpus and it is already in the response. `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`position`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is 1 for the conversation's first message and 2+ for anything after it.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`language`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is the language the message is written in. Many people write LinkedIn messages in two languages; Step 6 needs to keep them apart.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`preceding_message`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is the single message immediately before this one in the full thread, taken from the same page you already fetched: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`{text, sent_by_me, sent_at}`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, or `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`null`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` if this message is the conversation's first (position 1). It costs no extra call. It is what lets Step 7 tell a reply apart from a nudge:`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `preceding_message.sent_by_me`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`false`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: this message replies to something they said. Their text is the trigger.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `preceding_message.sent_by_me`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`true`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: this message follows up on your own message that got no reply in between. A nudge.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`got_reply`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is true when any message after the user's first has `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`sent_by_me: false`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Format.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Every opener has one of three formats, and they must never be clustered together:`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `invite_note`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: when a connection request is accepted, the invitation note appears as the first message. Use `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`message_type`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` to tell it apart from a normal message. Capped at 300 characters.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `inmail`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`conversation_type`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`INMAIL`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. Sent to someone outside the user's network, usually with a subject line.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `dm`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: everything else.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Group chats.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` If `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`is_group`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is true, or the thread has more than one other sender, keep `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`my_messages`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` for the voice corpus and exclude the conversation from all template statistics. A reply in a group is not a reply to an opener.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Conversations returning a cursor.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` A thread over 100 messages is a relationship, not templated outreach. Do not page it, and exclude it from template clustering, openers or replies alike. But keep its `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`my_messages`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` for the voice corpus. Long threads are the richest voice material in the sample.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Progress: one line per 20 conversations, not per conversation.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Do not delete `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#CE9178`,\"--shiki-dark-font-weight\":`bold`},children:\"`.linkedin_scan.json`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` at the end.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` It is what makes a later run instant.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`---`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 6: Voice extraction`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Skip if voice was not selected.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Corpus`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Every `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`my_messages`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` entry from every conversation including cursor ones and group chats, plus every pending invite note.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Drop before analyzing: quoted text, signature blocks, bare links, and one-word acknowledgements (\"thanks\", \"sure\", \"ok\", \"great\", and their equivalents in other languages). They inflate the count without adding signal. Report the real number: \"312 messages, 247 substantive.\"`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Under 15 substantive messages, stop. Say so and offer to widen. Do not build a profile from a handful of examples.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Languages`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Count substantive messages per language and say what you found: \"212 in English, 96 in German.\"`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` A language with 15 or more substantive messages gets its own rule set. Extract it separately. Do not blend languages: greetings, length, punctuation and formality differ.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` A language under 15 is listed under Low confidence with whatever is observable, and no rules.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Where the language has a formal and an informal address (du/Sie, tu/vous, tú/usted), record which one the user uses, with whom, and with counts. This is the rule a drafting skill most needs and most often gets wrong.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Note what decides the language, if the sample shows it: the other person's language, their country, who wrote first.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`A single-language corpus skips all of this silently.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Contamination flagging`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Before extracting anything, look for messages that were probably not written by the user.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Tells, in rough order of reliability:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` near-identical structure repeated across many messages that are not obviously a deliberate template`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` punctuation and capitalisation noticeably cleaner than the surrounding corpus`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` em dashes clustered in a subset while absent everywhere else`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sudden uniformity in length after a date`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sent in tight bursts at machine speed`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`If the user named a date in Step 1, weight anything after it more heavily.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Show the flagged set, grouped, with counts. Let the user exclude before the profile is written. Do not exclude anything silently.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Marking`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Every rule is labelled with where it holds:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `opener`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (position 1 DMs)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `reply`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (position 2+)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `invite_note`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (capped at 300 characters, always cold)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `inmail`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (only if the sample has enough of them)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`A rule holding in more than one bucket is stronger than one holding in a single bucket. Say which.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`This matters most for length and structure. An invite note is constrained to 300 characters, so any length rule derived from it is wrong applied to a DM. Never let invite note rules leak into DM guidance.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### What to extract`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Mechanics**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: length distribution, greeting forms, sign-offs, capitalisation, punctuation (including whether they actually use em dashes), emoji, contractions, link habits, line breaks and paragraphing.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Structure**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: how they open, how they make an ask, how they close, whether they front-load or bury the point.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Lexicon**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: recurring phrases, filler they do use, words and constructions they never use.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Register shifts**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: differences by `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`network_distance`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` or audience, but only if the sample actually supports it. Do not invent a split from four messages.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Every rule carries the count supporting it. Absolute numbers, never a bare percentage.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Preserving voice`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Document how this person writes, do not improve it. Lowercase stays lowercase. Missing punctuation stays missing. Blunt stays blunt. Typos they repeat are a habit, not an error. Do not add em dashes and do not add \"I hope this finds you well.\"`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`If the profile reads like advice, it is wrong. It is a description.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 7: Template extraction`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Skip if templates were not selected.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`This step covers two different things: how the user opens conversations, and how they reply or follow up once one is underway. They get different treatment because they answer different questions and use different metrics. Do not blend them into one comparison.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Openers`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Keep conversations where the earliest message has `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`sent_by_me: true`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`has_cursor`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is false and `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`is_group`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is false.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Report the yield plainly: \"58 of 100 were started by you.\"`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Under 15 usable, say so and offer to widen the sample. Do not invent patterns from four examples. Some people mostly receive messages rather than send them; for them, \"too few openers to template\" is the honest result, and the reply section below may still be worth building.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Cluster**`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Split first by format (`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`invite_note`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`inmail`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` or `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`dm`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), then by language if the user writes openers in more than one, then by intent.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Let the intents come from the messages. These are common ones, to start from, not a list to force the data into:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Cold open, no prior context`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Reaction to a signal: funding, job change, a post, a launch, hiring`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Warm intro via a mutual, an event, or shared content`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Follow-up right after a connection was accepted`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Re-engagement after silence`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Name each cluster after what the user is actually doing. A recruiter's \"candidate approach\", an investor's \"founder sourcing\" or \"intro request\", a founder's \"customer check-in\" are better names than a generic label, and the user will recognise them.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Cross-cut by audience from `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`headline`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`For each cluster of 3 or more, extract:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Skeleton**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: the move sequence. Opener, why now, relevance, ask, close.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Variables**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, using the vocabulary below.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Length**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` range in words.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Reply rate**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: replies over sends, always with absolute counts, never a bare percentage.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Ignored count**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, for invite note clusters: how many of this variant are still pending 7 or more days after sending.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Reply and follow-up moves`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Look at every `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`my_messages`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` entry at position 2 or higher, from conversations where `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`has_cursor`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is false and `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`is_group`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is false (keep the others for voice, exclude them from template clustering).`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Use `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`preceding_message`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` to split into two kinds before clustering either one:`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Replies**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, where `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`preceding_message.sent_by_me`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`false`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. The trigger is what they said. Group by what that inbound message was doing (asking about pricing, expressing interest, pushing back, asking a logistics question, going quiet then resurfacing) and let the clusters emerge from what the data actually shows. Reply triggers vary too much from one user to the next to predefine.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Nudges**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, where `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`preceding_message.sent_by_me`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` is `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`true`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. This is a follow-up on the user's own message that never got a reply. Cluster these on their own, separate from replies, since the trigger is silence rather than something said.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Nudges get their own bucket at a lower bar than the rest of this step: 3 examples is enough to report, because a silence follow-up pattern is worth surfacing even when thin, and the low-confidence flag already covers under 5. Do not fold nudges into a reply cluster just because the count is small.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`For each cluster of 3 or more, extract:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Skeleton**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: the move sequence.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Variables**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, using the vocabulary below.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Trigger**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: for replies, a short generic description of what prompted it (described rather than quoted, since real text gets scrubbed at Save anyway). For nudges, the typical gap: how many days after the unanswered message this was usually sent.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Length**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` range in words.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Continuation rate**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: of this move, how many led to another reply from them. Absolute counts. This is a different measurement from opener reply rate and must not be merged into the same table or ranked against it.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` For nudges specifically, also report how many eventually got a reply at all versus never did.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Do not restate voice rules in either section. They live in the voice profile. If templates were built without voice, keep a short voice note in the template file so it still stands alone.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### The comparison`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`This is the headline finding and it goes above the templates. Users care more about which approach works than about any single template.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`For openers: compare clusters against each other on reply rate, with counts. For example: signal reaction 18/44 replied, cold open 6/51 replied. Say what the difference suggests and what it does not prove.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`For replies and follow-ups: compare separately, on continuation rate, with counts. State plainly that this is a different metric measuring a different thing, not a second ranking of the same list. Call out the nudge finding specifically since it is usually the most actionable one: what share of unanswered threads got revived, and roughly how long after silence a nudge stops paying off if the data shows a cliff.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Where sample sizes are small, say so rather than ranking on noise. Under 5 sends is directional at best.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`For invite notes, report reply rate alongside the ignored count. Do not compute a single acceptance percentage. Accepted invites whose conversation fell outside the sample are invisible, which biases any such number downward, and the pending list is capped at 100. Two honest numbers beat one fake-precise one. If the invitations response came back truncated, say so: ignored counts are a floor rather than a total.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Variable vocabulary`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Only use these slots. They are named after the data source that fills them, so the drafting skill knows where to look.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`~~~`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{first_name} {company} {role} profile`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{mutual_connection} {shared_group} network`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{trigger_event} funding, job change, post, launch, hiring`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{shared_context} event, content, prior meeting`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{last_touchpoint} {last_call_topic} CRM, email, call transcripts`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{their_question} {their_objection} reply triggers, from the inbound message`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{my_ask} {cta} the user's intent`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`~~~`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`If a cluster genuinely needs a slot outside this list, name it after what would fill it. Never emit a vague slot like `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`{something_relevant}`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. The drafting skill cannot fill what it cannot identify.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 8: Review`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Ask, one topic at a time.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Voice**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: present the 6 or so strongest rules, each with its count and where it holds. Confirm, correct, or drop. A user who says \"actually I never do that\" is giving you better data than the sample.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Opener templates**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: at most 6 candidates, best reply rate first. For each: name, reply rate with counts, skeleton, one anonymized example. Keep, merge, or drop.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Reply and follow-up templates**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: at most 4 candidates, best continuation rate first, but always include the strongest nudge cluster regardless of where it ranks, since silence follow-ups are the ones most likely to get buried under higher-continuation reply clusters. For each: name, whether it is a reply or a nudge, continuation rate with counts, skeleton, one anonymized example. Keep, merge, or drop.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Do not dump everything in one wall of text.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 9: Save`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Scrub first.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Every real name, company, and identifying detail becomes a variable slot or a placeholder. Zero names of other people in either file.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Extract structure, not text.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Verbatim messages get sent verbatim and read like a bot. The value is the skeleton plus the rules.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Where.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` In the working folder root when there is one. Otherwise as downloadable files or documents, with one line telling the user to keep them where their AI tool can read them next time.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Voice profile`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Either a new `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`linkedin-writing-voice.md`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, or a LinkedIn section appended to the existing file, per the Step 1 answer.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`~~~markdown`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`# LinkedIn writing voice`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`\u003c!-- generated {date} | {N} substantive messages from {C} conversations + {I} invite notes | {date range} -->`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Core voice`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Three or four sentences describing how this person writes. Plain description.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Languages`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Which languages, with message counts, and what decides which one is used.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Omit this section for a single-language profile.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Rules`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`One table per language when there are several.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`| Rule | Holds in | Evidence |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`|---|---|---|`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`| lowercase greeting, no comma | openers, replies | 61 of 74 |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`| no sign-off on replies | replies | 88 of 91 |`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Formal or informal address`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Only for languages that have the distinction. Which form, with whom, with counts.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Invite notes`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Rules that apply only to the 300 character format. Do not apply these to DMs.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Register shifts`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Differences by audience, only where the sample supports it. Otherwise say there is`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`no evidence of a shift.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Never does`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Observed anti-patterns with counts. Things absent from the corpus.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Anti-slop list (generic, edit freely)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Not derived from your messages. These are common AI tells in English. Delete`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`anything you disagree with, add your own, including for your other languages.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \"I hope this finds you well\" and any variant`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \"I wanted to reach out\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \"It's not just X, it's Y\" and the same shape as a two-sentence fragment`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Tricolons everywhere. Three-item lists as a default rhythm.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \"delve\", \"leverage\", \"unlock\", \"game-changer\", \"revolutionize\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Rhetorical question as an opener`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Enthusiasm by exclamation mark`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \"As someone who...\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Closing by restating the opening`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Em dashes. Common tell, but genuinely used by some people. The Rules table`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` above says whether you use them. Trust that over this line.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Low confidence`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Under 10 messages supporting. Directional only.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`~~~`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Template library`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`linkedin_msg_templates.md`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. The shape is fixed because it is the interface to the drafting skill:`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`~~~markdown`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`# LinkedIn message templates`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`\u003c!-- generated {date} | {N} conversations, {M} pending invites | {date range} -->`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## What works: openers`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`| Approach | Format | Sends | Replies | Rate | Confidence |`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`One paragraph on what the comparison suggests.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Voice`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`See linkedin-writing-voice.md. (Or, if voice was not extracted, a short`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`voice note derived from the same messages so this file stands alone.)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Opener templates`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### O1. {name}`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Format:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` invite_note | inmail | dm`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Language:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {language}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Use when:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {the matching condition, written for the drafting skill}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Sends / replies:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` 12 / 5`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Skeleton:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ...`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Variables:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {first_name}, {trigger_event}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Example:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ...`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## What works: replies and follow-ups`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`| Approach | Kind | Instances | Continued | Rate | Confidence |`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`One paragraph on what the comparison suggests, including the nudge finding`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(share of unanswered threads revived, and the point where nudging stops paying off`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`if the data shows one).`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Reply and follow-up templates`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### R1. {name}`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Kind:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` reply | nudge`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Language:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {language}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Use when:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {the matching condition: what the inbound message was doing, or`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` how long the thread had gone quiet}`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Instances / continued:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` 9 / 4`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Skeleton:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ...`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Variables:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {their_objection}, {last_touchpoint}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Example:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ...`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Anti-patterns`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Things this user never does. Do not reintroduce them.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Low confidence`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Openers under 5 sends, replies and nudges under 5 instances. Directional only.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`~~~`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Every template needs an explicit `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Use when**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`. That is how the drafting skill selects one instead of guessing.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 10: Check it`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Only when a voice profile was written.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Hold back five real messages from the corpus, spread across the languages in the profile. For each, write a one-line brief describing what it was doing, then draft a replacement from the profile alone without looking at the original. Show both side by side.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Ask whether the drafts sound like them. Where they miss, ask what is off and fix the profile. A style file nobody trusts gets ignored.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Step 11: Wire it up`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`The files are inert until something tells the assistant to read them. Offer both hooks, once each, and do not push.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**A pointer in their instructions.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` One or two lines, wherever this environment keeps standing instructions (`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`CLAUDE.md`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, project instructions, custom instructions):`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#6A9955`},children:`>`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#D4D4D4`},children:` When drafting LinkedIn messages, read linkedin_msg_templates.md and linkedin-writing-voice.md first. This covers openers, replies, and follow-ups.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`A pointer, not the content, so it costs a line of context rather than the whole library. In a tool with no file access, the equivalent is adding the two files to the project's knowledge.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Drafting skills.**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` If you can list the user's installed skills, pick out any that write outreach, messages, sequences, or follow-ups, and ask which should reference these files. If you are able to edit skills, offer to add the line yourself. The Groovin companion skill `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`draft-linkedin-message`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` already reads both files by these names: if it is installed, say the two are ready to be used together; if it is not, mention it exists and leave it there.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Then close with two offers, once each:`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` If invite notes were thin in the sample, offer to take pasted examples.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` If a voice profile was built, note that LinkedIn is one channel and their sent email would deepen it, particularly for anything longer than a DM. Leave it with them.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#D4D4D4`,\"--shiki-dark-font-weight\":`inherit`},children:`---`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Failure handling`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **429 or 5xx on a chat read**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: wait briefly, retry once. If it fails again, stop, save state when you can, and tell the user to pick it up later.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Every Groovin call failing, including after it was working**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: the connection has expired. Tell the user to reconnect Groovin in their connector settings. Do not retry, do not speculate about account restrictions.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **A result that starts with \"Groovin connector problem\"**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: relay it and follow what it says.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Under 15 usable conversations, or under 15 substantive messages**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: say it. Offer to widen. Do not present four examples as a pattern.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **No clear clusters**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: say the messages are too varied to template. That is a finding, not a failure to cover up. This applies separately to openers and to replies/follow-ups; one can cluster cleanly while the other does not.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **Corpus mostly AI-drafted**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: say so and stop. A profile built on it would be worse than no profile, because it would be trusted. Offer to work from whatever predates the tool, or from pasted examples they know they wrote.`})]}),`\n`]})})})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Version 2026-10-12.`}),` Skills are plain text: adapt this one to how you work. When a new version is published here, replace your copy.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Skill: Analyze LinkedIn messages to capture your writing voice","sidebarTitle":"Analyze LinkedIn messages","description":"A skill that reads your real LinkedIn conversations and produces a writing voice profile plus templates for openers, replies and follow-ups, ranked by what actually gets answers.","href":"/mcp/skills/analyze-linkedin-messages"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What you get","slug":"what-you-get","depth":2,"children":[]},{"title":"How it works","slug":"how-it-works","depth":2,"children":[]},{"title":"Before you start","slug":"before-you-start","depth":2,"children":[]},{"title":"How to use it","slug":"how-to-use-it","depth":2,"children":[]},{"title":"The skill","slug":"the-skill","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"groovin","siteName":"Groovin","title":"Skill: Analyze LinkedIn messages to capture your writing voice - Groovin","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-12T15:17:47.679Z","originalFileLocation":"mcp/skills/analyze-linkedin-messages.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"A skill that reads your real LinkedIn conversations and produces a writing voice profile plus templates for openers, replies and follow-ups, ranked by what actually gets answers.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Groovin\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://media.brand.dev/f810fcbb-2382-4110-80c2-f249d1f9f172.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://media.brand.dev/f810fcbb-2382-4110-80c2-f249d1f9f172.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://media.brand.dev/f810fcbb-2382-4110-80c2-f249d1f9f172.png\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/png\" href=\"https://media.brand.dev/f810fcbb-2382-4110-80c2-f249d1f9f172.png\">\u003cmeta data-mint-head property=\"og:title\" content=\"Skill: Analyze LinkedIn messages to capture your writing voice - Groovin\">\u003cmeta data-mint-head property=\"og:description\" content=\"A skill that reads your real LinkedIn conversations and produces a writing voice profile plus templates for openers, replies and follow-ups, ranked by what actually gets answers.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Groovin\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.groovin.ai/mcp/skills/analyze-linkedin-messages\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://groovin.mintlify.app/_mintlify/api/og/v2?division=Skills\u0026amp;title=Skill%3A+Analyze+LinkedIn+messages+to+capture+your+writing+voice\u0026amp;description=A+skill+that+reads+your+real+LinkedIn+conversations+and+produces+a+writing+voice+profile+plus+templates+for+openers%2C+replies+and+follow-ups%2C+ranked+by+what+actu\u0026amp;theme=2fb27e555653d3152d4427c9\u0026amp;signature=4dea951f5be6ebbfe02fc03bf0a1805ef596fb650019e8228480ffccda64549b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Skill: Analyze LinkedIn messages to capture your writing voice - Groovin\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"A skill that reads your real LinkedIn conversations and produces a writing voice profile plus templates for openers, replies and follow-ups, ranked by what actually gets answers.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://groovin.mintlify.app/_mintlify/api/og/v2?division=Skills\u0026amp;title=Skill%3A+Analyze+LinkedIn+messages+to+capture+your+writing+voice\u0026amp;description=A+skill+that+reads+your+real+LinkedIn+conversations+and+produces+a+writing+voice+profile+plus+templates+for+openers%2C+replies+and+follow-ups%2C+ranked+by+what+actu\u0026amp;theme=2fb27e555653d3152d4427c9\u0026amp;signature=4dea951f5be6ebbfe02fc03bf0a1805ef596fb650019e8228480ffccda64549b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/groovin/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Groovin\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#f37546\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.groovin.ai/mcp/skills/analyze-linkedin-messages\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/mcp/skills/analyze-linkedin-messages.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.groovin.ai/#organization\",\"name\":\"Groovin\",\"url\":\"https://docs.groovin.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://media.brand.dev/8a452a89-9e16-46a4-97fb-c1afa22cee62.svg\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.groovin.ai#website\",\"name\":\"Groovin\",\"url\":\"https://docs.groovin.ai\",\"publisher\":{\"@id\":\"https://docs.groovin.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.groovin.ai/mcp/skills/analyze-linkedin-messages#webpage\",\"url\":\"https://docs.groovin.ai/mcp/skills/analyze-linkedin-messages\",\"name\":\"Skill: Analyze LinkedIn messages to capture your writing voice\",\"description\":\"A skill that reads your real LinkedIn conversations and produces a writing voice profile plus templates for openers, replies and follow-ups, ranked by what actually gets answers.\",\"dateModified\":\"2026-10-12T15:17:47.679Z\",\"isPartOf\":{\"@id\":\"https://docs.groovin.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.groovin.ai/mcp/skills/analyze-linkedin-messages#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.groovin.ai/mcp/skills/analyze-linkedin-messages#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Skills\",\"item\":\"https://docs.groovin.ai/mcp/skills\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Skill: Analyze LinkedIn messages to capture your writing voice\",\"item\":\"https://docs.groovin.ai/mcp/skills/analyze-linkedin-messages\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.groovin.ai/mcp/skills/analyze-linkedin-messages#article\",\"headline\":\"Skill: Analyze LinkedIn messages to capture your writing voice\",\"name\":\"Skill: Analyze LinkedIn messages to capture your writing voice\",\"description\":\"A skill that reads your real LinkedIn conversations and produces a writing voice profile plus templates for openers, replies and follow-ups, ranked by what actually gets answers.\",\"url\":\"https://docs.groovin.ai/mcp/skills/analyze-linkedin-messages\",\"mainEntityOfPage\":{\"@id\":\"https://docs.groovin.ai/mcp/skills/analyze-linkedin-messages#webpage\"},\"dateModified\":\"2026-10-12T15:17:47.679Z\",\"publisher\":{\"@id\":\"https://docs.groovin.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.groovin.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Groovin\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Groovin","nav":{"global":null,"tabs":[{"tab":"Getting started","icon":"home","hidden":true},{"tab":"MCP Server","icon":"code","groups":[{"group":"Get Started","pages":[{"title":"Groovin MCP: LinkedIn data for your AI assistant","sidebarTitle":"Overview","href":"/mcp/overview"},{"title":"Connecting to Groovin MCP","sidebarTitle":"Setup","href":"/mcp/setup"},{"title":"Tools Reference","sidebarTitle":"Tools Reference","href":"/mcp/tools/reference"}]},{"group":"Use Cases","pages":[{"title":"Groovin MCP Use Cases: ready-to-use prompts","sidebarTitle":"Use Cases","href":"/mcp/use-cases"},{"title":"Groovin MCP Prompt Library: copy-paste prompts for LinkedIn","sidebarTitle":"Prompt Library","href":"/mcp/prompt-library"}]},{"group":"Skills","pages":[{"title":"Groovin Skills: teach your AI assistant how you work on LinkedIn","sidebarTitle":"Skills Library","description":"Installable skills for Claude and other AI assistants that use Groovin MCP: learn your LinkedIn writing voice, then draft and send messages that sound like you.","href":"/mcp/skills"},{"title":"Skill: Analyze LinkedIn messages to capture your writing voice","sidebarTitle":"Analyze LinkedIn messages","href":"/mcp/skills/analyze-linkedin-messages"},{"title":"Skill: Draft a LinkedIn message in your voice","sidebarTitle":"Draft a LinkedIn message","description":"A skill that drafts LinkedIn messages, replies, follow-ups and connection notes in your own voice, then sends them through Groovin once you approve.","href":"/mcp/skills/draft-linkedin-message"}]},{"group":"Help","pages":[{"title":"Groovin MCP Troubleshooting: Fix Common Issues Fast","sidebarTitle":"Troubleshooting","href":"/mcp/troubleshooting"}]}]}]},"basePath":"","title":"Skill: Analyze LinkedIn messages to capture your writing voice - Groovin","buildId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","deploymentId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","dynamics":[],"chunks":[]}