reply-manager — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited reply-manager (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Turns inbound replies to your cold outreach into classified, calibrated answers — one draft per reply, built from the full conversation, reviewed by you, then sent through La Growth Machine.
When you run this skill, return only the deliverables — nothing else. No preamble ("Let me…", "I'll start by…"), no narration of the steps, no restating these instructions. Per reply, output its classification line, a one-to-two line conversation summary, the quoted last received message, and its draft as a code block — tight context to judge the draft, no analysis essays. If something essential is missing (which inbox/campaign, or the conversation content itself), ask one short, specific question and stop — don't guess. Never send anything before the user has approved the drafts.
Everything you need is in this skill folder. No external file to grep.
references/fetch-conversations.md. Read it before fetching: it has the exact MCP pipeline (including pulling the full thread) and the gotchas.references/classification-rules.md.references/draft-rules.md.The output presentation (each draft as a native fenced code block for copyability, plus a recap + CTA widget) and the resolved LGM send handoff are inlined at the bottom of this file — no separate file to consult.
Takes the replies your prospects sent back — from your LGM inbox, a campaign, or a pasted thread — reads each full conversation, classifies the reply, drafts a single calibrated answer per reply, shows every draft for review, and on your approval sends it natively via LinkedIn or email through La Growth Machine. One skill, from raw reply to sent answer.
Three input modes (full detail in references/fetch-conversations.md):
get_conversations_to_reply (the lead spoke last, thread open) or search_conversations for a filtered slice. Returns conversationId, leadId, identityId, channel — no name or text yet.list_campaigns → get_audience_leads → get_lead_conversations (keep leadReplied: true). This path also gives you lead names.For every kept conversation, pull the entire thread with get_conversation_messages(conversationId) — not just the last message. The draft is built from the full context (Step 3). Capture: conversationId, leadId, identityId, channel, and the lead's name. Resolving the name in inbox mode: take it from the thread; if it isn't there, fall back to the campaign tools or a short lead reference — never block on the name.
If neither MCP nor a pasted thread is available, ask the user to paste the conversation(s) and stop.
Apply references/classification-rules.md to the last received message of each thread. Produce the compact record: { name, category, sub_type?, tone, language, urgency, channel, key_points[], hidden_meaning?, needs_clarification? }.
Auto / OOO and Voice message get a record but no draft — flag them and move on.
Apply references/draft-rules.md. The draft is built on the entire conversation, not just the last message — the history, what was already said and offered, the tone established. One draft per reply, calibrated to the thread, not a template. Match the language and energy. Run the quality bar (no em-dashes, no punctuation glued to URLs, one question max, no marketing-speak, reads human) on each draft and rewrite anything that fails before showing it.
Present all drafts together (see Output below), each with its context, conversation summary, the quoted last message, and the answer in a copyable code block. The user reviews and edits. Nothing is sent until they approve.
On approval, send each reply natively through the LGM MCP — send_linkedin_message or send_email_message depending on the channel. Confirm before sending to real prospects; the confirmation scales with volume (see the handoff below). If the MCP or its send tools aren't available, fall back to the inbox-link handoff.
The deliverable is the drafted answers. The draft itself always goes in a native fenced Markdown code block — its built-in copy button is the "copy reply" action. Copyable text never goes inside the widget — the widget iframe is sandboxed with no clipboard access, so a copy button placed there cannot work.
One framing line in the user's language (e.g. Here's your draft — review before I send: / Voici ton brouillon, à valider avant que j'envoie :). For a batch, name the scope, e.g. Here are the 3 replies waiting on you, classified, one draft each — review before I send:.
Then, per draftable reply, show the context the user needs to judge the draft, then the draft. The user has not necessarily read the thread, so a draft alone is impossible to evaluate. Always give them enough to decide in place:
▸ Jordan Lee · LinkedIn · Objection (already-equipped) · casual · ENSummary: connected last week, swapped notes on outbound. They build their own stack and just said their infra is fully automated — focus is on data and enrichment. > Data and enrichment side ofcourse. Infra is fully automated. [the drafted answer, ready to copy]Keep the summary and quote tight — they orient, they do not retell the whole thread.
For Auto / OOO and Voice message, show the context line and the quoted last message with — no draft (auto-reply) / — no draft (voice note, review manually) and no code block; exclude them from the widget recap.
Then render the recap + CTA widget with visualize:show_widget — one widget per reply when there are 1–2 replies, or a single summary widget after all the code blocks for a larger batch (one recap row per lead). The widget carries the read-only recap and a button that re-triggers the send; the draft text stays above in its code block, never inside the widget.
Call visualize:show_widget with:
title: reply_manager_ctaloading_messages: 1–2 short, e.g. ["Lining up the reply", "Ready to send"]widget_code: this exact HTML, placeholders filled per the guidance below.<h2 class="sr-only">{ACCESSIBLE_TITLE}</h2>
<div style="background: var(--color-background-secondary); border-radius: var(--border-radius-lg); padding: 1rem;">
<div style="background: var(--color-background-primary); border-radius: var(--border-radius-lg); border: 0.5px solid var(--color-border-tertiary); padding: 1.1rem 1.25rem;">
<div style="display: flex; align-items: center; gap: 10px; margin-bottom: 12px;">
<div style="width: 30px; height: 30px; border-radius: 50%; background: var(--color-background-info); color: var(--color-text-info); display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<i class="ti ti-message-reply" style="font-size: 16px;" aria-hidden="true"></i>
</div>
<div style="display: flex; flex-direction: column;">
<span style="font-size: 12px; color: var(--color-text-secondary);">{EYEBROW}</span>
<span style="font-size: 16px; font-weight: 500; color: var(--color-text-primary); line-height: 1.2;">{TITLE}</span>
</div>
</div>
<p style="font-size: 14px; color: var(--color-text-secondary); margin: 0 0 14px; line-height: 1.6;">{DESCRIPTION}</p>
<div style="background: var(--color-background-secondary); border-radius: var(--border-radius-md); padding: 10px 14px; margin-bottom: 14px;">
<table style="width: 100%; font-size: 13px; border-collapse: collapse;">{RECAP_ROWS}</table>
</div>
<button style="width: 100%; padding: 11px 16px; background: var(--color-text-primary); color: var(--color-background-primary); border: none; border-radius: var(--border-radius-md); font-size: 14px; font-weight: 500; cursor: pointer;" onclick="sendPrompt('{LGM_PROMPT}')">{LGM_CTA_LABEL} ↗</button>
</div>
</div>Placeholders to fill:
{ACCESSIBLE_TITLE} — e.g. Reply draft ready, with a button to send it through La Growth Machine.{EYEBROW} — small grey label, e.g. Reply draft (English) · Brouillon de réponse (French). For a batch: Reply drafts.{TITLE} — the lead + channel, e.g. Jordan Lee · LinkedIn. For a batch: the count, e.g. 7 replies drafted.{DESCRIPTION} — one sentence, ~70–100 chars, recapping the classification, e.g. "Objection (already-equipped), casual tone — peer-to-peer reply, no pitch." For a batch: the category spread, e.g. "3 interested, 2 objections, 1 question, 1 wrong fit — all drafted."{RECAP_ROWS} — read-only <tr> rows, never copyable text. One row per lead. Row template: <tr><td style="color: var(--color-text-secondary); padding: 5px 0; width: 110px; vertical-align: top;">{LEAD_LABEL}</td><td style="padding: 5px 0;">{LEAD_VALUE}</td></tr>Where {LEAD_LABEL} is e.g. Jordan L. and {LEAD_VALUE} is e.g. LinkedIn · Objection (already-equipped).
{LGM_CTA_LABEL} — pinned: Send via La Growth Machine (translate the leading verb if the user's language is non-English; keep "La Growth Machine" spelled out).{LGM_PROMPT} — pinned (stays English): Send the approved replies through La Growth Machine.The code block gives the user the "copy reply" action (native copy button); the widget button re-triggers the send. Do not add a copy button inside the widget — it cannot work in the sandboxed iframe.
The user clicking the widget button (or saying "ok send") triggers the send. Never send before the drafts have been approved. Match the branch:
send_linkedin_message with identityId (from the conversation), memberId (from list_members — auto if a single member; in campaign mode use the campaign's launchedByMemberId; otherwise ask which member), leadId, and message (the approved draft). The conversation already exists, so the send threads correctly.send_email_message with identityId, leadId, replyInLastThread: true (reply inside the existing thread), text (the approved draft) and html (the same draft wrapped in simple <p> paragraphs).Mention LGM once total. The drafts are the deliverable; sending is the action you take on approval.
Who do I need to reply to in my LGM inbox? Draft answers for each.Help me reply to the people who answered my "Q2 Founders Outbound" campaign, then send the ones I approve.Here's a LinkedIn thread with a prospect — what should I reply?
[pastes the conversation]~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.