Step eight. Money is in dialogues, not in likes (Module 5). Three modes that work independently:
| Mode | What it does | Cadence |
|---|---|---|
--mode=targets |
strategy → 4 audiences → boolean queries → live list of profiles | once + weekly refresh |
--mode=radar (default) |
fresh posts of targets → selection → comment drafts → digest | 1–2×/day |
--mode=log |
what was actually posted + replies → dedup, mix, signals into research | in the evening / on Friday |
Drafts only — you post MANUALLY. Auto-comments = ban risk + LinkedIn's AI classifier cuts the account's distribution.
Normative doc: ${CLAUDE_PLUGIN_ROOT}/reference/engage-playbook.md — audiences, boolean, selection gates,
comment types, quality gate, state schema. Read BEFORE any mode.
Additionally: methodology.md §4 (distribution), Section 2 of the strategy (audiences), Section 6 (voice).
Input: $ARGUMENTS — client (default — the only active one) + optional flags.
State: engage-state.json in the client's working folder (not in the plugin repo). If none — create it.
Mode A · --mode=targets — build a list of whom to comment on
This is what was missing: the list is not pulled out of thin air and does not wait for a manual CSV.
A1 · Retrieve the four audiences
Read Section 2 of the strategy (Notion 🧭 {Client} · Strategy) — the block “four audiences:
ICP / peers / co-pilots / thought leaders”. Extract for each: who they are, examples, geo, size.
- Section 2 is incomplete or there is no strategy → don't get blocked: build a draft of the buckets from what there is (author profile, website, ICP doc, GTM strategy), mark each line [ASSUMPTION] and put at the end a block “Confirm or correct” — 4 short questions, not a questionnaire.
A2 · Audience → targeting card
For each bucket, build a card per §2 of the playbook: titles · keywords · exclude · geo ·
company_size · language · seed_profiles (3–5 live profiles) · target_count.
From this — two boolean strings per bucket: one for title, one for keywords.
Show the queries to the user BEFORE searching — editing a string is cheaper than re-sifting the results.
A3 · Find profiles (channel ladder, §3 of the playbook)
The order is strict, top to bottom, up to the set target_count:
- Sales Nav → notifications "Suggested lead … shared a post" — already shortlisted people with a fresh post.
- Sales Nav → Lead search: boolean у Title/Keywords + Spotlights → Posted on LinkedIn
(past 30 days) + geo/size. Save as Saved Search + Lead List per bucket
(
ENG · ICP,ENG · Peers,ENG · Co-pilots,ENG · TL). - LinkedIn → Posts → keywords → Latest — search by content, not by people; catches authors outside the lists.
- Own network: who liked/commented on the author's posts over the month.
- Second circle: who constantly comments under the seed profiles' posts.
- Apify (no-cookie) — when you need batch/cron:
apimaestro/linkedin-posts-search-scraper-no-cookiesorharvestapi/linkedin-post-search.
Engine: --engine=chrome (default) — a live user session via browser tools; we don't
scrape anything bypassing the login, li_at is not needed. --engine=apify — headless batch for cron/n8n.
In chrome mode: read and navigate only. No connects, likes, messages, saves
without direct permission in the chat.
A4 · Hard filter
A profile with no posts in 30 days does not make it onto the list — there's nothing to comment on under it,
however ideal the ICP. Record cadence (how much they post per week) — it then drives the frequency.
A5 · Output
Write to engage-state.json → targets + (if Notion is connected) a sub-page
"🎯 {Client} · Engage Targets" with a table: Name · Bucket · Profile · Why them · Posting cadence ·
Source · Latest comment. Summary: how many in each bucket, where the shortfall is, which queries produced junk.
Mode B · --mode=radar — comment drafts (default)
B1 · Collect fresh posts
Sources by priority: Sales Nav notifications per slot → posts by targets (chrome: feed/profiles;
apify: apimaestro/linkedin-profile-posts in batch) → keyword search Latest for top-up.
Slot window: morning ~9:00, midday ~15:00 in the target audience's timezone; without --slot — both.
B2 · Selection gates (§4 of the playbook)
Freshness ≤ 3 h (TL — ≤ 60 min) · in the topic cluster · not an ad/vacancy/repost-without-a-thought · there is a thesis or a number to latch onto · this author has not been commented on for 7 days · the opinion has not yet been said in the top comments (check BEFORE drafting) · this same opinion has not been left under another post this week.
B3 · Queue and mix
Rank = свіжість × вага бакета × сила зачіпки. Volume 5–15 drafts/day.
The mix 20% ICP / 50% peers / 15% co-pilots / 15% TL is measured by week, not by day: first fill in
the bucket that is underfilled for the week (count by log).
B4 · Write a comment
Read the entire post (not the headline) + top comments. Choose a type from §5 of the playbook (experience-addendum · counter-example · mechanics · clarifying-probe · translation to another audience · a number from the field · outright disagreement). Write in the voice of Section 6 of the strategy; the language of the comment = the language of the post. 25–60 words, one block, specifics (a number / a case without a name / a tool / a threshold).
B5 · Quality gate (§6 of the playbook) — strict
Run every draft through anticopywriting-ai. Discard and rewrite if there is: “great post”
in any form · retelling of the post · “not X, but Y” · triads · dash constructions · a pitch/link/name
of a service · a compliment longer than half a sentence · a generality without a number · >1 emoji · client names.
Final check: would the author have replied to this. No — rewrite, do not soften.
B6 · Output — digest
For each draft: author + bucket + link to the post + age of the post + why this post + comment type + ready text in one block for copying. Order = priority; on top is what expires first. Channel: chat (default) → Notion page of the slot → Telegram, if the channel is configured in the client's config. At the end: the current mix of the week and what is missing.
Mode C · --mode=log — close the loop
- Ask/accept what of the drafts was actually posted and what was replied.
- Add to
engage-state.json → log: date · slot · author · bucket · comment type · posted · reply. - Comment-mining: recurring questions, objections, and pains from posts and threads → in
minedand further incontent-researchasSource = comment-mining. - Weekly summary: actual mix vs 20/50/15/15 · which types of comments produced replies · which targets have been silent for 3+ weeks (candidate for removal) · where to add profiles.
Definition of Done
- targets: 4 buckets have boolean queries and a live list of profiles (each with posts for 30 days), recorded in the state; the shortfall per bucket is stated out loud.
- radar: drafts passed the selection gates AND the quality gate; the week's mix is taken into account; each draft — with a link, reason, and ready-to-copy text.
- log: what was posted is recorded, dedup works, signals are handed off to
content-research. - No action in the LinkedIn account without permission — only reading and drafts.