LinkedIn — Organic Presence Orchestrator
Portability + safety: 17 stdlib-only Python scripts. No LinkedIn credentials, no API
calls, no scraping, nothing auto-sent. Every output is text the account holder posts
themselves — automated posting, connecting, and commenting are prohibited by LinkedIn's
User Agreement §8.2, and a restricted account ends the whole project.
Building an authentic presence over months, not generating a post. The five lanes cover what
actually moves: who you are (profile), what you stand for (strategy), what you publish
(content), who you talk to (engagement), and what any of it did (analytics).
Step 1 — Gate, before anything is drafted
python3 scripts/linkedin_policy_gate.py --text "<the user's own words>" --output human
- exit 4 REFUSE — a named rule is broken (automation, scraping, pods, bulk DMs, fake
identity, fabricated proof, a prohibited automation platform). Do not draft it: name the
rule, offer the substitute the gate prints, and route there instead. A REFUSE outranks any
route below.
- exit 3 CONSTRAIN — proceed, and state the constraint out loud in your reply.
- exit 0 ALLOW — proceed.
Step 2 — Route
python3 scripts/linkedin_goal_router.py --text "<the goal>" --output human
Exit 0 routes — invoke that lane, surfacing any prerequisite as a question first.
Exit 2 is ambiguous — ask one question naming both candidates, with a recommendation.
Exit 3 has no signal — ask what they want to walk away with, rather than guessing.
| Lane |
Typical ask |
linkedin-profile |
"fix my headline", "my profile gets views but nothing happens" |
linkedin-strategy |
"what should I post about", "how often", "should I start a newsletter" |
linkedin-content |
"write this post", "turn my talk into posts", "is this hook any good" |
linkedin-engagement |
"who should I comment on", "write a connection note" |
linkedin-analytics |
"why did reach drop", "what's working", "should I test this" |
Step 3 — Forcing questions
One at a time, each with a recommended answer. Stop as soon as the lane can run honestly.
/cs:grill-linkedin walks all five with the recommendation and the canon behind each.
- What has to be true in 90 days for this to have been worth it? (Not a follower count.)
- Who is this for, specifically enough that someone is excluded?
- How many minutes a week will you protect — measured from a bad week?
- What proof already exists? (If none, the first pillar is process, not results.)
- What will you not post about?
Hard rules
- Nothing is automated and nothing is sent. No credentials, no API, no scraping.
- Refuse, then substitute. Every REFUSE names the compliant alternative.
- The account holder is the author of record. They read every line before it ships.
- No claim they cannot substantiate. A real number, a bounded range, or nothing.
- Never silently chain lanes. Offer the next one as a question.
- Cite the confidence level. LinkedIn-official is 🟢, third-party studies are 🟡,
folklore is 🔴 and gets named as folklore.
Scripts
| Script |
Role |
scripts/linkedin_policy_gate.py |
ALLOW / CONSTRAIN / REFUSE against User Agreement §8.2 + Community Policies. 7 refusal rules, each with a substitute. |
scripts/linkedin_goal_router.py |
Deterministic five-lane classifier: route (0) / ask (2) / no-signal (3), with cross-lane prerequisites. |
References and assets
references/linkedin_platform_canon.md — how the feed ranks, evidence-graded (7 sources)
references/policy_and_account_safety.md — §8.2, prohibited software, restriction triggers (7 sources)
assets/linkedin_operating_agreement.md — the standing rules in one page, agreed before work starts
Distinct from
marketing-skill/x-twitter-growth — X/Twitter mechanics. Different platform and rules.
marketing-skill/social-content / social-media-manager — multi-platform brand
calendars. This is one person's presence on one platform, in depth.
marketing-skill/social-media-analyzer — cross-platform campaign reporting.
Version: 1.0.0 · 5 lanes · 17 stdlib scripts · nothing auto-sent
1---2name: linkedin-skills3description: Use when someone wants to grow an organic LinkedIn presence — a content strategy for a career change or consulting or thought leadership, a rewritten profile or headline, post drafts and hooks, a posting cadence or newsletter plan, connection notes and outreach, a commenting strategy, repurposing an article or talk into posts, or a read on why their reach dropped. Triggers on "grow my LinkedIn", "fix my headline", "write a LinkedIn post", "what should I post about", "LinkedIn strategy", "connection request", "my reach dropped". Forks context to route to one of five sub-skills, and refuses automation, scraping, pods, and bulk DMs before any drafting starts.4license: MIT5---67# LinkedIn — Organic Presence Orchestrator89> **Portability + safety:** 17 stdlib-only Python scripts. **No LinkedIn credentials, no API10> calls, no scraping, nothing auto-sent.** Every output is text the account holder posts11> themselves — automated posting, connecting, and commenting are prohibited by LinkedIn's12> User Agreement §8.2, and a restricted account ends the whole project.1314Building an authentic presence over months, not generating a post. The five lanes cover what15actually moves: who you are (profile), what you stand for (strategy), what you publish16(content), who you talk to (engagement), and what any of it did (analytics).1718## Step 1 — Gate, before anything is drafted1920```bash21python3 scripts/linkedin_policy_gate.py --text "<the user's own words>" --output human22```2324- **exit 4 REFUSE** — a named rule is broken (automation, scraping, pods, bulk DMs, fake25 identity, fabricated proof, a prohibited automation platform). Do not draft it: name the26 rule, offer the substitute the gate prints, and route there instead. A REFUSE outranks any27 route below.28- **exit 3 CONSTRAIN** — proceed, and state the constraint out loud in your reply.29- **exit 0 ALLOW** — proceed.3031## Step 2 — Route3233```bash34python3 scripts/linkedin_goal_router.py --text "<the goal>" --output human35```3637Exit 0 routes — invoke that lane, surfacing any `prerequisite` as a question first.38Exit 2 is ambiguous — ask **one** question naming both candidates, with a recommendation.39Exit 3 has no signal — ask what they want to walk away with, rather than guessing.4041| Lane | Typical ask |42|---|---|43| `linkedin-profile` | "fix my headline", "my profile gets views but nothing happens" |44| `linkedin-strategy` | "what should I post about", "how often", "should I start a newsletter" |45| `linkedin-content` | "write this post", "turn my talk into posts", "is this hook any good" |46| `linkedin-engagement` | "who should I comment on", "write a connection note" |47| `linkedin-analytics` | "why did reach drop", "what's working", "should I test this" |4849## Step 3 — Forcing questions5051One at a time, each with a recommended answer. Stop as soon as the lane can run honestly.52`/cs:grill-linkedin` walks all five with the recommendation and the canon behind each.53541. What has to be true in 90 days for this to have been worth it? *(Not a follower count.)*552. Who is this for, specifically enough that someone is excluded?563. How many minutes a week will you protect — measured from a bad week?574. What proof already exists? *(If none, the first pillar is process, not results.)*585. What will you not post about?5960## Hard rules6162- **Nothing is automated and nothing is sent.** No credentials, no API, no scraping.63- **Refuse, then substitute.** Every REFUSE names the compliant alternative.64- **The account holder is the author of record.** They read every line before it ships.65- **No claim they cannot substantiate.** A real number, a bounded range, or nothing.66- **Never silently chain lanes.** Offer the next one as a question.67- **Cite the confidence level.** LinkedIn-official is 🟢, third-party studies are 🟡,68 folklore is 🔴 and gets named as folklore.6970## Scripts7172| Script | Role |73|---|---|74| [`scripts/linkedin_policy_gate.py`](scripts/linkedin_policy_gate.py) | ALLOW / CONSTRAIN / REFUSE against User Agreement §8.2 + Community Policies. 7 refusal rules, each with a substitute. |75| [`scripts/linkedin_goal_router.py`](scripts/linkedin_goal_router.py) | Deterministic five-lane classifier: route (0) / ask (2) / no-signal (3), with cross-lane prerequisites. |7677## References and assets7879- [`references/linkedin_platform_canon.md`](references/linkedin_platform_canon.md) — how the feed ranks, evidence-graded (7 sources)80- [`references/policy_and_account_safety.md`](references/policy_and_account_safety.md) — §8.2, prohibited software, restriction triggers (7 sources)81- [`assets/linkedin_operating_agreement.md`](assets/linkedin_operating_agreement.md) — the standing rules in one page, agreed before work starts8283## Distinct from8485- **`marketing-skill/x-twitter-growth`** — X/Twitter mechanics. Different platform and rules.86- **`marketing-skill/social-content` / `social-media-manager`** — multi-platform brand87 calendars. This is one person's presence on one platform, in depth.88- **`marketing-skill/social-media-analyzer`** — cross-platform campaign reporting.8990---9192**Version:** 1.0.0 · 5 lanes · 17 stdlib scripts · nothing auto-sent