计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
linkedin-post-writer【效率与协作】Drafts LinkedIn posts from a brief: picks an angle and opening pattern the author's real material supports, structures the body, and gates the draft before it is pasted. Use when writing a post, choosing a hook, or checking a draft before publishing.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Most weak posts are decided before the first word is written. The author starts from a topic ("something about onboarding") instead of from material (a number, a date, a thing a customer said), so the draft has to be built from generalities, and generalities all sound alike. The opening is then chosen for how it sounds, a format is borrowed from a post that did well for someone else, and the result is a confident paragraph about nothing in particular with a question bolted to the end.
This skill reverses the order. It starts with an inventory of what the author really has, lets that inventory decide which of fourteen opening patterns are available, builds the body from beats that each need a fact, and runs a mechanical gate before the text leaves the editor. Patterns the author lacks the material for are not offered; instead the skill says which single question would unlock them.
Scope boundary. This skill drafts a single feed post and checks it. It does
not run the full machine-tell audit, score emoji, or build a voice
fingerprint; hand the draft to linkedin-humanizer for that. It does not
study other people's posts to extract their openings; that is
linkedin-hook-analyzer. Drawing a story out of an author who "has nothing to
say" is linkedin-story-interviewer; turning an article, talk or thread into
posts is linkedin-content-repurposer; deciding what to post this month is
linkedin-content-planner. Comments and replies (linkedin-comment-writer,
linkedin-reply-manager, linkedin-thread-tracker), profile copy
(linkedin-profile-optimizer), team programmes (linkedin-employee-advocacy)
and performance review (linkedin-engagement-analytics) are separate skills.
Everything here is offline: the skill produces text for the user to paste into
LinkedIn themselves. It does not post, schedule, fetch, or call any service.
assets/post_brief_template.md)Before drafting, confirm these inputs. If any is unknown or vague, ASK — do not assume:
Stop rule: ask only the 2-3 that most change the output. If the user says "just draft it," use the material in the request as given, pick the top-ranked pattern, and list the assumed goal and audience at the top of the reply. If there is no material at all, ask the single unlock question for the pattern that best fits the topic; do not invent a figure to get started.
Quick start: fill in the brief, run the picker, draft from the first option, run the gate.
assets/post_brief_template.md with the author, or convert their
notes into the JSON shape in assets/sample_brief.json. Leave a material
field empty if the author does not have it.caution lines. A counter-position or a prediction with no
evidence behind it is an opinion; get the evidence or choose another pattern.python3 tools/linkedin/linkedin-post-writer/scripts/angle_picker.py \
--input tools/linkedin/linkedin-post-writer/assets/sample_brief.json --top 3
references/opening-patterns.md. The agent writes it from the author's
material and nothing else; the point of the line must land inside the first
clause.references/post-structures.md).
One beat per paragraph, each anchored to a fact. Cut any beat the author has
no fact for.python3 tools/linkedin/linkedin-post-writer/scripts/angle_picker.py \
--input tools/linkedin/linkedin-post-writer/assets/sample_brief.json \
--top 5 --format json
references/pre-publish-gate.md §4. The tool
cannot do this part.linkedin-humanizer.python3 tools/linkedin/linkedin-post-writer/scripts/post_gate.py \
--input tools/linkedin/linkedin-post-writer/assets/sample_draft.txt
python3 tools/linkedin/linkedin-post-writer/scripts/post_gate.py \
--input tools/linkedin/linkedin-post-writer/assets/sample_draft_revised.txt
The first sample fails with two blockers and three warnings. The revised version of the same post passes clean.
The pattern is chosen by what the author has, then ranked by goal. Goal-fit scores are editorial heuristics, not measurements.
| The author has… | Pattern | Strongest for |
|---|---|---|
| One precise figure | Receipt line | Saves, inbound |
| A date and something that went wrong | Dated mistake | Conversation |
| A moment they were present for | Cold scene | Conversation, reshares |
| A belief they dropped | Changed mind | Conversation |
| A disagreement with common practice, plus evidence | Counter-position | Conversation, reshares |
| A before and an after | Measured gap | Saves, inbound |
| Someone's exact words | Borrowed line | Conversation |
| A rule they keep | House rule | Saves |
| A count of things examined | Field count | Saves, reshares, inbound |
| A question they keep being asked | Reported question | Conversation |
| A person who did a specific thing | Named credit | Reshares |
| A term their audience misuses | Plain definition | Saves |
| An expectation with a date on it | Dated bet | Conversation, reshares |
| Three or more real steps | Counted list | Saves |
| Decision | Recommendation | Why |
|---|---|---|
| Start from topic or from material | [PROVEN] Material. If there is none, ask for it before drafting | A post is as specific as its least specific input |
| Opening: statement or question | [RECOMMENDED] Statement. Put a real question at the close | A question in line one asks for attention before giving a reason |
| Where the key fact goes | [PROVEN] In the first clause of the first line | The feed truncates the opening; anything after the cut is seen only by people already interested |
| How many ideas | [PROVEN] One. Park the second in a note for the next post | Two ideas halve the space for evidence on each |
| Length | [RECOMMENDED] As long as the facts last: usually 600 to 1,400 characters | Past the facts, length is restatement |
| Include what failed | [RECOMMENDED] Yes, with the same precision as what worked | It is what separates a report from a promotion |
| Hashtags | [RECOMMENDED] None to three, on the last line | They are labels, not content |
| A link in the body | [EXPERIMENTAL] Put it in the first comment unless the link is the point | Widely practised, effect unverified; the gate warns and --allow-links overrides |
| Mentioning the author's product | [RECOMMENDED] Once, where the story reaches it | Earlier, the post becomes an advert |
| Setting | Default | Status |
|---|---|---|
| Post character limit | 3,000 | Current as of writing; verify in the product |
| Characters visible before truncation | 140 | Conservative mobile estimate as of writing; desktop shows more. Override with --fold-chars |
| Markdown rendering | None | As of writing, asterisks and pound signs display literally |
These change without notice. Treat them as configuration, not knowledge.
Mistake: The author has a line they like ("Nobody talks about the real cost of meetings") and builds four paragraphs to justify it.
Why it happens: A good-sounding line arrives easily and feels like progress. The material that would support it takes effort to dig out.
Instead: Fill in the brief first. angle_picker.py will show that the line is a teaser with nothing behind it, and that the author's real asset is, say, "62 person-hours every Monday", which opens the post on its own.
Mistake: A measured-gap post did well for someone else, so the author writes "We went from struggling to thriving in six months" with no figures.
Why it happens: The format is visible and the measurements behind it are not.
Instead: Treat every pattern's needs as a hard requirement. A gap needs two numbers measured the same way and a time span. If the author has one number, it is a receipt line; if none, the pattern is locked and the picker says what to ask.
Mistake: The post tells a story, lists seven tips, thanks the team, and ends by inviting people to book a call.
Why it happens: Each addition seems free, and each stakeholder has a request.
Instead: One goal per post, chosen in the brief. The goal sets the pattern ranking and the close. Everything else goes in a note for the next post; linkedin-content-planner is the place to schedule them.
Mistake: Every paragraph reports success. The fortnight where two teams shipped conflicting changes is cut "to keep it positive". Why it happens: The author is writing under their employer's name and caution feels safe. Instead: Keep one cost, exception or unsolved part, stated as precisely as the wins. Compare the two sample drafts: the revised one opens on the mistake, and it is the more credible post.
Mistake: "What do you think?" or "Agree?" as the last line.
Why it happens: The author has been told to end on a question and has no specific one.
Instead: Ask something that can only be answered from experience ("what broke in the first two weeks?") or end on the last fact. post_gate.py blocks the stock wordings outright.
Mistake: Exit code 0, so the draft is pasted. Why it happens: A green check feels like approval. Instead: The gate checks mechanics. It cannot tell whether the figure is right, whether Ines agreed to be quoted, or whether the post is interesting. Check every fact against the brief and have the author read the text aloud once.
Tools overview and reference documentation for this skill:
| File | Purpose |
|---|---|
scripts/angle_picker.py | Ranks the fourteen opening patterns by the material in a brief and the stated goal; prints the opening skeleton, body beats and close for each, and the unlock question for every pattern the brief cannot support |
scripts/post_gate.py | Pre-paste gate with fifteen checks: opening fit and phrasing, length, placeholders and markup, paragraph density, hashtags, links, specificity, habit spot-check, closing line; exits 1 on any blocker or excess warnings |
references/opening-patterns.md | The fourteen patterns: what each needs, how to build it, an original example, the usual way it goes wrong, and four opening types to avoid |
references/post-structures.md | Body beats per pattern, the second line, closes by goal, length bands, layout, and a full worked draft from the sample brief |
references/pre-publish-gate.md | Every gate check with its level and rationale, platform mechanics and their caveats, the manual checks the tool cannot do, and how to tune thresholds |
assets/sample_brief.json | A filled brief for a fictional COO writing about cancelling a weekly all-hands |
assets/sample_draft.txt | First draft from that brief; fails the gate on a placeholder, a stock closer, a long opening, a dense paragraph and six hashtags |
assets/sample_draft_revised.txt | The same post after revision; passes the gate |
assets/post_brief_template.md | Fill-in brief covering goal, audience, material inventory, constraints and sign-off |