claude-skills/marketing/linkedin/commands/cs-linkedin-post.md
Claude 645c523be1
feat(marketing): add linkedin plugin — organic presence with platform rules in code
Answers discussion #934, which asked for a strategic assistant for growing a
LinkedIn presence organically rather than a post generator.

Six skills under marketing/linkedin/: an orchestrator (context: fork) plus
profile, strategy, content, engagement, and analytics lanes. 17 stdlib-only
tools, 15 references, 2 agents, 8 /cs:* commands.

The design constraint is the differentiator: no LinkedIn credentials, no API
calls, no scraping, nothing auto-sent. Automated posting, connecting, and
commenting are prohibited by LinkedIn's User Agreement 8.2, and a restricted
account ends a compounding asset. linkedin_policy_gate.py runs before any
drafting and refuses seven request classes — automation, scraping, engagement
pods, bulk messaging, fake identity, fabricated proof, named third-party
automation platforms — each carrying the policy anchor and a compliant
substitute, so the gate never just says no.

Refusals are real rather than advisory. A cadence under 90 minutes a week
returns a comment-only plan instead of a schedule that dies in week five. A
newsletter whose six-month cost exceeds the budget is refused before the promise
is made. An experiment needing more posts than a quarter allows is reported
infeasible rather than quietly re-sized. The pattern miner refuses to test
anything below 10 posts and reports NOTHING_SURVIVED as a finding.

Evidence discipline: two widely repeated claims are corrected rather than
propagated. The "personalised note triples acceptance" claim is not supported by
the largest samples (acceptance is near-identical either way, ~26.4%); what a
note moves is the post-accept reply rate (~5.4% to ~9.4%), which is why the
message builder refuses an ask in a first-touch note. The ~19% in-body link
reach reduction has never been confirmed by LinkedIn as a penalty and has a
plausible dwell-time explanation, so it is a warning rather than a block. Every
reference carries per-claim confidence levels.

Accessibility is a blocking lint finding: Unicode pseudo-bold is announced by
screen readers as mathematical symbols and is not indexed by search.

All six SKILL.md files are 6/6 PASS on the write-a-skill checklist. Every tool
supports --help, --sample, and --output json with typed exit codes.

Counters: skills 380 -> 386; plugins 96 -> 97; tools 706 -> 723; refs 823 -> 838;
agents 114 -> 116; commands 138 -> 146 (derive_counters.py --check).

Also syncs three previously-merged skills (agent-memory, hivemind, skill-doctor)
into the .hermes/ and .vibe/ mirror trees, which had drifted behind .codex/.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JSPxUHU6utqme7qC6EwHEh
2026-08-25 07:32:30 +00:00

2.9 KiB

name description argument-hint
cs-linkedin-post /cs:linkedin-post — Pick the format the material actually supports, draft to the ~140-character mobile fold, and lint 0-100 across mechanics, hook, integrity, and accessibility. Blocking findings for the 3,000-character cap, engagement bait, and Unicode pseudo-bold. [the post idea, or paste a draft to be reviewed]

/cs:linkedin-post — Format, draft, lint

Command: /cs:linkedin-post [idea or draft]

When to run

  • "Write a LinkedIn post about X" / "review my draft"
  • "Is this hook any good?"
  • "Should this be a carousel or a text post?"

When NOT to run

What you get

  1. A format recommendation with the constraint it carries — or one question when the top two score within a point.
  2. A draft built from your specifics, with a sentence completing inside the first ~140 characters.
  3. A lint score 0-100 with every finding carrying a fix.
  4. Accessibility done — alt text written, captions flagged, no pseudo-bold.

Workflow

# 1. Format from the material, not from fashion
python3 ../skills/linkedin-content/scripts/format_picker.py \
  --goal authority --material data --material tutorial --minutes 120 --output human

# 2. Draft (the interview comes first: the number, the mistake, the sentence someone said)

# 3. Lint to a clean exit
python3 ../skills/linkedin-content/scripts/post_linter.py \
  --input draft.md --has-image --output human
#   exit 0 SHIP · exit 2 REVISE (or any blocking finding) · exit 3 REWRITE

Discipline

  • Interview before drafting. A post with no specifics cannot be fixed by editing.
  • Never fabricate a number, client, result, or quote — not even as a placeholder.
  • Write to the mobile fold. A sentence completes before character 140.
  • Links in the first comment, and say so in the post.
  • No engagement bait. Ask the question the post actually earned.
  • One idea per post. If it needs two, it is two posts.
  • Cut the first paragraph and check whether the post starts better at paragraph two.

Stop conditions

  • Linter at exit 0 → done. Hand over with "you are the author of record; read every line".
  • Linter at exit 2 with only warnings the user has knowingly accepted → done, with the accepted warnings restated.
  • Three REWRITE passes on the same draft → the problem is the idea, not the wording. Go back to the specifics.