@cratis/pi 6.3.2 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,127 +1,229 @@
1
1
  ---
2
2
  name: cratis-social-feed-post
3
- description: Write or review a short post for a social feed such as LinkedIn, where the opening has to survive the feed's truncation, the body is plain text with no markup, and the common formatting tricks cost accessibility and reach. Use when drafting, adapting or reviewing a feed post. Do not use for documentation pages, release notes, long-form articles, or anything rendered as Markdown.
3
+ description: Write or review a short post for a social feed such as LinkedIn, where only the opening shows before "see more", the body is plain text with no markup, posts lead with media that carries the Cratis mark, and formatting tricks cost accessibility. Use when drafting, adapting or reviewing a feed post, choosing its media, or adapting it for another channel. Do not use for documentation pages, release notes, long-form articles, or anything rendered as Markdown, and hand length, voice and distribution questions to their own skills.
4
4
  license: MIT
5
5
  ---
6
6
 
7
7
  # Social feed post
8
8
 
9
- A feed post is not a short article. The feed shows a few lines and hides the rest behind a
10
- "see more" control, so the opening is not an introduction to the point — it is the entire
11
- advertisement for the post, and the decision to expand is itself a ranking signal.
9
+ Someone scrolling a feed sees two or three lines of a post and its first image, and decides
10
+ there whether to read on. This skill covers what a post has to do inside that preview, what
11
+ media it leads with, and how it survives a phone screen and a screen reader.
12
12
 
13
- Everything below assumes a plain-text feed with no markup rendering. The character and line
14
- figures are unofficial approximations reported by third parties; no platform documents them,
15
- and they move with interface, font size and device width. Treat them as a target zone and
16
- re-check them against current official guidance rather than encoding them as durable rules.
13
+ Other skills own the neighboring questions. Use them instead of improvising here:
17
14
 
18
- ## The fold decides what the post is judged on
15
+ - How long the post should be: **cratis-content-length**.
16
+ - Whether it reads as written by a person: **cratis-writing-voice-and-cadence**.
17
+ - Where it goes, how often, and how to tell whether it worked: **cratis-developer-marketing**.
18
+ - The facts in a release or feature announcement: **cratis-release-notes**. This skill only
19
+ adapts them for the feed.
20
+ - The code on a code card: **cratis-technical-examples**. A card links to the complete,
21
+ versioned source and never stands in for it.
19
22
 
20
- On LinkedIn the cut is modelled two ways at once and lands on whichever runs out first:
23
+ ## What the platform actually says
21
24
 
22
- - a character budget of roughly 210 on desktop and 140 on mobile, and
23
- - a budget of about three rendered lines.
25
+ LinkedIn described its current feed in March 2026. An LLM-based retrieval system feeds a
26
+ sequential ranking model, and the models learn from what members read, like, comment on,
27
+ return to and scroll past, with long dwells among the modeled actions. LinkedIn names those
28
+ signals and publishes no weights for them. It doesn't say whether expanding a particular post
29
+ counts for anything, so don't write as if it did.
24
30
 
25
- **A blank line spends the line budget without spending characters.** A short opening on its
26
- own line is therefore cut *earlier* than the same words inside a paragraph. Putting the hook
27
- on its own line is usually still right, because it is what a scroller reads first, but it is
28
- a trade rather than a free improvement.
31
+ Our editorial preference is one clear subject: one point per post. And whatever the ranking
32
+ does, a reader who doesn't expand the post never sees the rest of it.
33
+
34
+ LinkedIn has also said that AI may help with wording, but a post has to represent its
35
+ author's own voice and perspective. It says content that appears AI-generated and lacks a
36
+ clear perspective is less likely to be shown beyond the author's own network. That's
37
+ LinkedIn describing its own system, not an outside measurement, and it points the same way
38
+ as everything else here: the post needs an author with something to say.
39
+
40
+ The reviewed sources disclose no first-hour windows, hashtag counts, link penalties or save
41
+ weights. The folklore table in
42
+ [the engagement evidence](references/engagement-evidence.md) lists the common claims and what
43
+ the sources do and don't support.
44
+
45
+ ## The preview decides what the post is judged on
46
+
47
+ Third-party tools report that LinkedIn shows roughly 210 characters on desktop and 140 on
48
+ mobile before "see more". LinkedIn doesn't publish these numbers. They are unofficial
49
+ approximations that move with the interface, font size and screen width, so check the real
50
+ preview on a phone before trusting any count.
51
+
52
+ Line wrapping and blank lines can change what fits in the preview. Check the actual mobile and
53
+ desktop rendering.
29
54
 
30
55
  ## What the opening must do
31
56
 
32
- - **Finish a complete thought above the cut.** An opening severed mid-sentence has spent the
33
- whole advertisement on half an idea.
34
- - **Stay short on purpose.** A brief opening sentence is a hook doing its job. Do not rewrite
35
- one into a longer, smoother sentence for the sake of rhythm; that removes the
36
- advertisement. This is the most common way a well-meaning editing pass makes a post worse.
37
- - **Earn the identifier before using it.** An opening that begins with a framework type or a
38
- product name asks a scroller to care about a word they have no reason to recognize yet.
39
- Name the friction first, then the mechanism.
40
- - **Skip the throat-clearing.** The first line is the point, not a preamble to it.
41
-
42
- Check the opening by reading only the first three lines and asking whether they are worth
43
- expanding. If the answer depends on the fourth line, the opening is wrong.
44
-
45
- ## Sound like a person talking
46
-
47
- A post that reads as generated gets scrolled past as generated, however accurate it is. The
48
- fix is not a smoother sentence. It is writing the way someone who built the thing would
49
- explain it to a colleague over coffee.
50
-
51
- - **Open with something that happened.** What shipped, a real number, what you found this
52
- week. A concrete, checkable event reads as a person reporting. An aphorism about the domain
53
- ("A skill is just text…") reads as a slogan, however clever it is.
54
- - **Talk, don't announce.** Contractions, a sentence that starts with "So" or "And", a
55
- parenthetical aside, a question answered straight away ("Why bother? Because…"). Use them
56
- the way speech does, now and then, not as a new pattern on every line.
57
- - **Show the default, then the better way.** Name what the reader, or their coding agent,
58
- writes today in concrete terms, then the shape you are offering, with real identifiers. A
59
- before-and-after persuades; adjectives do not.
60
- - **Sell with specifics.** Enthusiasm is welcome and a list of real capabilities is
61
- persuasive. What persuades is the command, the count, and the thing the reader can do
62
- tomorrow, not "powerful", "seamless" or "game-changing".
63
- - **Say why in the words you would use out loud.** A reason with a stake ("we don't want the
64
- good version of that to be a paid add-on") beats a principle stated in the abstract.
65
- - **Put a limit where it applies.** "On macOS and Linux, the installer…" carries the limit
66
- inside the claim. A closing paragraph labeled "One honest limit:" reads as a disclaimer a
67
- reviewer bolted on.
68
- - **Keep the review out of the copy.** Evidence, verification and approval language belongs
69
- in the review record. A qualifier that protects the writer instead of informing the reader
70
- makes the post read as noncommittal. Keep every qualification that is true and would
71
- change what the reader does; drop the rest.
72
- - **Stop when you are done.** A plain next step ("Links in the comments") ends a post better
73
- than a tidy closing maxim.
74
-
75
- The tells to remove in review are listed in the **cratis-writing-voice-and-cadence** skill.
57
+ Finish a complete thought inside the preview. An opening cut off mid-sentence spends the whole
58
+ preview on half an idea.
59
+
60
+ Make it a specific proposition: what shipped, what broke, a number, the task the reader is
61
+ stuck on today. It has to be true. If the author didn't see it happen, it doesn't go in as
62
+ something they saw.
63
+
64
+ A brief opening sentence is a hook doing its job. Don't smooth it into a longer, rounder
65
+ sentence during an edit. Avoid lengthening an opening if that makes its thought disappear
66
+ below the preview.
67
+
68
+ Name the problem before the identifier. A type name or product name in the first line asks a
69
+ scroller to care about a word they have no reason to know yet.
70
+
71
+ Then test it. Read only the preview and ask whether you'd expand it. If the answer depends on
72
+ the line after the cut, rewrite the opening.
73
+
74
+ ## Lead with media on LinkedIn
75
+
76
+ On LinkedIn, a Cratis post leads with at least one asset by default. Text-only is allowed,
77
+ and sometimes it's the right vehicle for one sharp point. It is a decision made on purpose and
78
+ noted with the draft, not what happens because nobody made an image.
79
+
80
+ This is Cratis's editorial default and an open hypothesis that Cratis is measuring. It isn't a
81
+ proven effect. The vendor datasets behind it, Buffer's medians and Socialinsider's
82
+ business-page averages, show higher engagement rates for documents, multi-image posts and
83
+ video than for text. They are observational. They measure engagement, not reach. Neither
84
+ dataset reports GIFs separately. [The SEO Works](https://www.seoworks.co.uk/downloads/data-led-analysis-of-linkedin-video-vs-carousels/)
85
+ reports counting slide-advance clicks in its own carousel engagement calculation; this does
86
+ not establish Buffer's or Socialinsider's calculation. The
87
+ figures and their caveats are in the evidence reference.
88
+
89
+ Choose the asset by what it has to explain. A code card suits one mechanism a developer can
90
+ read in a few seconds. Use several images when the opening names several layers, such as a
91
+ command and the event it produces; don't split one idea across two posts to fit one image. A
92
+ document suits a sequence, like steps, a before-and-after or a decision walked through page by
93
+ page, with the claim on the cover and one idea on each page. Use a GIF or screen recording
94
+ when the motion is the point, and make sure its first frame makes sense on its own. Video is
95
+ for real behavior shown end to end, captioned so it works with the sound off.
96
+
97
+ A stock photo or a decorated title card explains nothing, so it doesn't count. The first image
98
+ is seen before the text is expanded and does the same job as the opening line: one idea,
99
+ readable on a phone.
100
+
101
+ Every image needs alt text that carries its idea, and the post should still make sense with
102
+ the images removed.
103
+
104
+ ## Brand every asset with the Cratis mark
105
+
106
+ Every image, card, document page, GIF, video and screenshot Cratis publishes carries the
107
+ Cratis mark. The reason is attribution. Media gets saved and reshared away from its post, and
108
+ the mark is what still says where it came from. The reviewed evidence establishes no logo
109
+ effect on organic reach, and this rule doesn't claim one.
110
+
111
+ - Use the real mark, unaltered: not stretched, cropped, recolored, redrawn or animated.
112
+ - Make it large enough, with enough contrast, to read on a phone.
113
+ - Place it for the format: a brand row on a card or image; on a document's cover and in the
114
+ same spot on every page after it; on every frame of a GIF, because the feed can show any
115
+ frame; as a persistent corner mark on designed video, clear of player controls and captions.
116
+ - Screenshots and screen recordings are framed, never stamped. The capture sits unchanged
117
+ inside a branded frame, because painting a logo over captured pixels changes what the
118
+ capture shows.
119
+ - Leave the logo out of alt text. Describe the idea in the image.
120
+
121
+ An asset without the mark isn't ready to publish.
76
122
 
77
123
  ## Never use Unicode pseudo-formatting
78
124
 
79
- Third-party tools offer pseudo-bold and pseudo-italic built from Mathematical Alphanumeric
80
- Symbols — the characters that look like `𝗕𝗼𝗹𝗱` and `𝘐𝘵𝘢𝘭𝘪𝘤`. Do not use them.
81
-
82
- - **Assistive technology cannot read them.** A screen-reader user hears "mathematical bold
83
- capital T, mathematical bold small h" through an entire line, or hears nothing at all.
84
- - **They are not the letters they resemble.** Platform search and ranking index the actual
85
- code points, so a styled keyword is no longer that keyword and the term is lost.
86
-
87
- Emphasis in a plain-text feed comes from sentence construction, line placement and what is
88
- said first. A point that needs visual weight belongs in an image with its own alt text.
89
-
90
- ## Two things that cost reach outright
91
-
92
- - **No external link in the body.** Current ranking suppresses posts that carry one; the
93
- convention is to put the link in a comment. Verify this at review rather than repeating it
94
- as folklore, and never write the convention into the copy itself.
95
- - **No engagement bait.** "Repost if…", "Tag someone who…", "Agree?" are treated as spam
96
- signals rather than as engagement. A genuinely answerable question that follows from the
97
- argument is a different thing and is welcome.
98
-
99
- ## Structure that survives a phone
100
-
101
- - One thread per post. A feed reader will not assemble two arguments. An announcement may
102
- still list what shipped as a plain list of short fragments inside that thread, with no
103
- bolded labels and no slogan per item.
104
- - Short paragraphs, one to three sentences, and visibly different from each other in length.
105
- A column of identically sized blocks reads as a generated template before it reads as an
106
- argument.
107
- - Blank lines separate paragraphs and nothing else. Each one costs line budget above the fold.
108
- - No Markdown. The feed renders none of it, so `**bold**` and `# heading` reach the reader
109
- as literal characters.
110
- - Hashtags on the last line only, never mid-sentence.
111
- - Every image needs alt text. A post whose point lives only in an unlabeled image has no
112
- point for part of its audience.
125
+ The feed renders no Markdown, so `**bold**` and `# heading` arrive as literal characters.
126
+ Third-party tools offer a workaround: "bold" and "italic" letters built from Mathematical
127
+ Alphanumeric Symbols, the characters that look like `𝗕𝗼𝗹𝗱` and `𝘐𝘵𝘢𝘭𝘪𝘤`. Don't use them.
128
+
129
+ Assistive technology cannot read them reliably. A screen reader may spell out "mathematical
130
+ bold capital T" letter by letter, or skip the word. They use different code points from
131
+ ordinary letters; search behavior depends on the platform's normalization.
132
+
133
+ Emphasis in a plain-text feed comes from what you say first and where the lines break. A point
134
+ that needs visual weight belongs in an image with its own alt text.
135
+
136
+ Keep to one thread per post. An announcement can still list what shipped as short, plain
137
+ fragments inside that thread. Blank lines separate paragraphs and do nothing else, since each
138
+ one uses preview space. Hashtags go on the last line, never mid-sentence. No source supports a
139
+ particular count; our default is one or two that name the subject.
140
+
141
+ ## Links and bait
142
+
143
+ On LinkedIn, keep external links out of the body by default. That's an editorial default, not
144
+ a platform rule. The sources reviewed don't show that a body link lowers distribution, and
145
+ "always put the link in the first comment" is folklore. We do it because a post should be
146
+ worth reading without the click. When the link is what the reader needs, such as the runnable
147
+ sample the post is about, it goes in the body. On channels where the link is the post, none
148
+ of this applies. Don't explain the placement inside the post, and never present it as an
149
+ algorithm fact.
150
+
151
+ No engagement bait: "Repost if…", "Tag someone who…", "Agree?". A question that follows from
152
+ the argument, and that the author actually wants answered, is a different thing and welcome.
153
+
154
+ ## Length
155
+
156
+ How long a post should be depends on its job. Work that out with **cratis-content-length**
157
+ rather than a rule of thumb from here.
158
+
159
+ Feed posts should vary. A short post that makes one point and a longer worked example both
160
+ belong in the same feed, and a feed where every post is the same length reads as a template
161
+ before anyone reads the words. The one large LinkedIn length dataset covers personal profiles
162
+ and is correlational, so it's no reason to pad a company post. Hard platform limits are listed
163
+ in the evidence reference.
164
+
165
+ ## Voice
166
+
167
+ Run the voice review with **cratis-writing-voice-and-cadence**. It has the constructions to
168
+ cut, the checks for sameness across posts, and the rule that no rewrite may change a claim.
169
+
170
+ The feed-specific part is whose voice it is. A post goes out under a named person or a team,
171
+ so the perspective and any first-hand account have to be theirs, and they review it before
172
+ it's ready.
173
+
174
+ ## After publishing
175
+
176
+ Plan for the author to answer comments. In Buffer's data, LinkedIn posts where the account
177
+ replied to comments had about 30% more engagement than that same account's posts without
178
+ replies. Buffer says itself that this doesn't show replies cause it. Replies take the author's
179
+ time, so count that time when planning a post.
180
+
181
+ An agent never replies on anyone's behalf. It can draft an answer for the author to rewrite
182
+ and send.
183
+
184
+ Where posts go, how often, and how to measure what happened belongs to
185
+ **cratis-developer-marketing**.
186
+
187
+ ## Other channels
188
+
189
+ A post adapted for another channel is rewritten for it, not cross-posted. Read each
190
+ channel's current rules before posting.
191
+
192
+ - X, Bluesky and Mastodon want something shorter: one finding, offered as part of a
193
+ conversation rather than a broadcast. Their limits are counted differently (weighted
194
+ characters on X, graphemes on Bluesky, and a Mastodon default each server can change), so
195
+ check the evidence reference. On Mastodon, put context and hashtags in the post and alt
196
+ text on every image.
197
+ - On Reddit, answer the question the community asked, with a reproducible example, and say
198
+ that you work on the project. Read that subreddit's rules first.
199
+ - On Hacker News, AI doesn't write or edit anything Cratis posts: not the title, not the
200
+ text, not a comment. HN's guidelines prohibit generated or AI-edited text in comments.
201
+ Extending that to everything Cratis submits is Cratis's own stricter policy, not something
202
+ the guidelines say. You may help a person gather facts, links and answers for them to check.
203
+ HN also asks for the original source and, usually, the original title, asks that the site
204
+ not be used mainly for promotion, and prohibits asking for upvotes or comments.
205
+ - On dev.to, Hashnode or a blog, post the complete tested piece with versions and a canonical
206
+ link, not a teaser.
207
+ - On YouTube, use a title and thumbnail that match what the video shows.
113
208
 
114
209
  ## Before publishing
115
210
 
116
- - The opening thought is complete above the fold on mobile as well as desktop.
117
- - No pseudo-formatted characters anywhere, including the hook.
118
- - No link in the body and no engagement bait in the close.
119
- - Every image carries alt text, and the post still makes sense with the images removed.
120
- - Every technical claim is one the underlying source actually supports, and any limitation
121
- the post depends on is stated rather than implied.
211
+ - On LinkedIn, the post leads with at least one asset that explains something, or text-only
212
+ was chosen on purpose and noted.
213
+ - Every image, document page, GIF frame and video carries the Cratis mark, and screenshots
214
+ are framed rather than stamped.
215
+ - The opening thought is complete inside the preview on mobile as well as desktop.
216
+ - No Markdown and no pseudo-formatted characters anywhere, including the hook.
217
+ - On LinkedIn, no link in the body unless the reader needs it there, and no engagement bait.
218
+ - Every image has alt text, and the post makes sense with the images removed.
219
+ - Every technical claim is one the underlying source supports, and any limitation the post
220
+ depends on is stated rather than implied.
221
+ - The named author has reviewed the perspective the post speaks in.
122
222
 
123
223
  ## Stop conditions
124
224
 
225
+ Nothing is ever published, scheduled or replied to by an agent. Drafting a post doesn't
226
+ authorize publishing, scheduling, tagging, mentioning, uploading or replying.
227
+
125
228
  Stop and ask when the account owner, the author's perspective, the evidence behind a claim,
126
- or an asset's permission is unresolved. Drafting a post is not authorization to publish,
127
- schedule, tag, mention or upload it.
229
+ an asset's permission or its branding is unresolved.
@@ -0,0 +1,138 @@
1
+ # Engagement evidence for feed posts
2
+
3
+ This is the public evidence behind the feed post skill, as of 2026-09-25. Each row states the
4
+ claim the way the source supports it, which is often narrower than the way it gets repeated.
5
+ Platforms change their ranking and formats often, so recheck the sources before relying on a
6
+ row and correct this file when they change.
7
+
8
+ **Grades**
9
+
10
+ - **Official**: the platform describing its own system or publishing its own rules. Good
11
+ evidence of what the platform says. It doesn't show that a tactic works.
12
+ - **Vendor, observational**: data a tool vendor collected from its own customers. It shows
13
+ correlation within that population. It isn't causal, and it isn't the whole platform.
14
+ - **Third-party guidance**: a vendor's description or advice, not a measurement and not an
15
+ official specification.
16
+
17
+ **Verification** records what happened when each claim was checked against its source by
18
+ quote. *Confirmed* means the source says what the row says. *Partly confirmed* means the row
19
+ has been narrowed to what the source supports. *Checked against source* marks figures read
20
+ directly off the source page outside the quote-level review.
21
+
22
+ ## LinkedIn: what the platform says
23
+
24
+ | Claim as supported | Source | Date | Population / metric | Grade | Verification |
25
+ | --- | --- | --- | --- | --- | --- |
26
+ | LinkedIn is rolling out an LLM- and GPU-powered feed ranking system. The article gives no scoring formula for creators. | [LinkedIn Engineering](https://www.linkedin.com/blog/engineering/feed/engineering-the-next-generation-of-linkedins-feed) | 2026-03-12 | System description; no outcome metric | Official | Confirmed |
27
+ | The architecture couples unified LLM-based retrieval with a sequential ranking model. | Same article | 2026-03-12 | System description | Official | Confirmed |
28
+ | The models use profile context and each member's history of what they read, liked, commented on, returned to or scrolled past. | Same article | 2026-03-12 | Model inputs; relative weights undisclosed | Official | Confirmed |
29
+ | A post's representation includes its format, author information, engagement counts, article metadata and text. | Same article | 2026-03-12 | Model inputs; relative weights undisclosed | Official | Confirmed |
30
+ | LLM embeddings let members discover posts beyond keyword matches, including from authors they don't follow. This describes retrieval, not guaranteed reach. | Same article | 2026-03-12 | System description | Official | Confirmed |
31
+ | Long dwells, likes, comments and shares are among the actions the ranking model embeds. No relative weights are given. | Same article | 2026-03-12 | Model inputs; relative weights undisclosed | Official | Confirmed |
32
+ | New posts get embeddings in near real time, and embeddings for posts gaining engagement are refreshed. The article sets no one-hour cutoff; that doesn't prove no timing effect exists. | Same article | 2026-03-12 | System description | Official | Confirmed |
33
+ | AI may help with writing, but posts and comments should represent the member's own voice and perspectives. | [LinkedIn: Keeping conversations real](https://news.linkedin.com/2026/keeping-conversations-real-on-linkedin) | 2026-06-04 | Policy statement | Official | Confirmed |
34
+ | Content that appears AI-generated and lacks a clear perspective is less likely to be distributed beyond the author's immediate network. This is LinkedIn's own account, not independently measured, and not a ban on AI assistance. | Same statement | 2026-06-04 | Policy statement | Official | Confirmed |
35
+
36
+ What these rows don't tell you: whether expanding "see more" on a given post is itself a
37
+ ranking signal, how any signal is weighted, or how long a post should be.
38
+
39
+ ## LinkedIn: format engagement
40
+
41
+ | Claim as supported | Source | Date | Population / metric | Grade | Verification |
42
+ | --- | --- | --- | --- | --- | --- |
43
+ | Buffer analyzed over 52 million posts across 10 platforms. Its figures describe Buffer-posted content only, and Buffer says it isn't a full-platform view. | [Buffer, State of social media engagement 2026](https://buffer.com/resources/state-of-social-media-engagement-2026/) | 2026-03-05 | Buffer customers' posts | Vendor, observational | Confirmed |
44
+ | Document (PDF carousel) posts had a median engagement rate of 21.77%. | Same report | 2026-03-05 | Median engagement rate, LinkedIn, Buffer sample | Vendor, observational | Confirmed |
45
+ | Video had a median engagement rate of 7.35% and images 6.52%. | Same report | 2026-03-05 | Median engagement rate, LinkedIn, Buffer sample | Vendor, observational | Confirmed |
46
+ | Link posts had a median engagement rate of 3.81% and text posts 3.18%. This compares formats; it does not test a link in the body against a link in a comment. | Same report | 2026-03-05 | Median engagement rate, LinkedIn, Buffer sample | Vendor, observational | Confirmed |
47
+ | Socialinsider's LinkedIn benchmark is built from business pages: 1.3 million posts from 16,645 active pages, January 2024 to December 2025. Different population from personal profiles. | [Socialinsider LinkedIn benchmarks](https://www.socialinsider.io/social-media-benchmarks/linkedin) | Page metadata 2026-03-16 | Business pages | Vendor, observational | Confirmed |
48
+ | In Q2 2026, average engagement rates were: multi-image 6.90%, documents 6.60%, video 5.90%, images 5.20%, text 3.95%. | Same page | Q2 2026 | Average engagement rate. Business pages; Q2 sample size and methodology not established by the cited 2024–2025 population. | Vendor, observational | Checked against source |
49
+ | Documents led 2025 with a 7.00% average engagement rate. | Same page | 2025 | Average engagement rate, business pages | Vendor, observational | Checked against source |
50
+ | For pages with up to 50K followers, multi-image posts had the most impressions per post. This is the only reach finding in this table. | Same page | Live | Impressions per post, pages up to 50K followers | Vendor, observational | Checked against source |
51
+ | The SEO Works reports counting slide-advance clicks in its own carousel engagement calculation; this does not establish Buffer's or Socialinsider's calculation. Not an official LinkedIn metric definition. | [The SEO Works, LinkedIn video vs carousels](https://www.seoworks.co.uk/downloads/data-led-analysis-of-linkedin-video-vs-carousels/) | 2025 sample | One agency's own LinkedIn channel; measurement method | Third-party guidance | Confirmed |
52
+
53
+ Neither dataset reports GIFs or infographics separately. Engagement rate is not reach. The
54
+ SEO Works reports counting slide-advance clicks in its own carousel engagement calculation;
55
+ this does not establish Buffer's or Socialinsider's calculation. Buffer reports medians and
56
+ Socialinsider averages, over different populations, so don't put their numbers side by side
57
+ as if they measured the same thing.
58
+
59
+ ## LinkedIn: replies and frequency
60
+
61
+ | Claim as supported | Source | Date | Population / metric | Grade | Verification |
62
+ | --- | --- | --- | --- | --- | --- |
63
+ | Buffer's reply analysis covered nearly 2 million posts from more than 220,000 accounts on six platforms, comparing each account with itself. | [Buffer, State of social media engagement 2026](https://buffer.com/resources/state-of-social-media-engagement-2026/) | 2026-03-05 | Within-account comparison, Buffer sample | Vendor, observational | Confirmed |
64
+ | LinkedIn posts where the account replied to comments had about 30% more engagement than the same account's posts without replies. Buffer says this doesn't mean replies cause it. | Same report | 2026-03-05 | Within-account engagement difference | Vendor, observational | Confirmed |
65
+ | Buffer's LinkedIn frequency analysis covered over 2 million posts from more than 94,000 accounts. The page title says 2026; the page shows a publication date of 2025-08-28. | [Buffer, How often to post on LinkedIn](https://buffer.com/resources/how-often-to-post-on-linkedin/) | 2025-08-28 | Buffer customers' LinkedIn accounts | Vendor, observational | Confirmed (date partly confirmed) |
66
+ | Posting 2 to 5 times a week was associated with 1,182 more impressions per post and a 0.23 percentage-point higher engagement rate than posting once a week. Not causal, and not a minimum anyone must meet. | Same article | 2025-08-28 | Within-account impressions and engagement rate | Vendor, observational | Confirmed |
67
+
68
+ ## Length and the preview
69
+
70
+ | Claim as supported | Source | Date | Population / metric | Grade | Verification |
71
+ | --- | --- | --- | --- | --- | --- |
72
+ | In 372,126 personal-profile posts (September 2025 to February 2026), posts of 1,301 to 2,500 characters had 27% higher engagement than posts under 400. Not a company-page result and not causal. | [AuthoredUp, LinkedIn character limit](https://authoredup.com/blog/linkedin-character-limit) | 2026-04-02, updated 2026-08-11 | Engagement rate by character band, personal profiles | Vendor, observational | Confirmed |
73
+ | Median engagement by band: 2.10% at 1 to 400 characters, 2.61% at 1,301 to 2,000, 2.67% at 2,001 to 2,500, 2.62% at 2,501 to 3,000. The curve isn't monotonic. Cite the table; an interactive graphic on the same page shows 2.63% for the last band. | Same page | 2026-08 update | Median engagement rate, personal profiles | Vendor, observational | Confirmed |
74
+ | AuthoredUp, not LinkedIn, reports a 3,000-character post limit and a preview of roughly 210 characters on desktop and 140 on mobile before "see more". These are approximations that depend on the interface. | Same page | 2026-08 update | Interface description | Third-party guidance | Confirmed |
75
+
76
+ ## Platform limits
77
+
78
+ | Claim as supported | Source | Date | Population / metric | Grade | Verification |
79
+ | --- | --- | --- | --- | --- | --- |
80
+ | Bluesky's post schema limits text to 300 graphemes and 3,000 UTF-8 bytes. | [AT Protocol post lexicon](https://raw.githubusercontent.com/bluesky-social/atproto/main/lexicons/app/bsky/feed/post.json), units per [lexicon spec](https://atproto.com/specs/lexicon) | Live, unpinned | Hard limit | Official | Confirmed |
81
+ | Mastodon's default limit is 500 characters. Instances can change it. | [Mastodon posting guide](https://docs.joinmastodon.org/user/posting/) | Live | Default limit | Official | Confirmed |
82
+ | An ordinary X post can hold 280 weighted characters; emoji, URLs and some Unicode ranges count differently. The page doesn't cover paid longer posts. | [X character counting](https://docs.x.com/fundamentals/counting-characters) | Live | Hard limit, weighted | Official | Confirmed |
83
+
84
+ ## Hacker News
85
+
86
+ | Claim as supported | Source | Date | Population / metric | Grade | Verification |
87
+ | --- | --- | --- | --- | --- | --- |
88
+ | Submit the original source, and generally the original title unless it's misleading or linkbait. | [HN guidelines](https://news.ycombinator.com/newsguidelines.html) | Live | Site rule | Official | Confirmed |
89
+ | Posting your own work part of the time is fine; using HN primarily for promotion is not. | Same page | Live | Site rule | Official | Confirmed |
90
+ | Don't solicit upvotes, comments or submissions. | Same page | Live | Site rule | Official | Confirmed |
91
+ | "Don't post generated text or AI-edited text. HN is for conversation between humans." The rule sits under "In Comments"; the guidelines don't state it for submissions. | Same page | Live | Site rule | Official | Confirmed |
92
+
93
+ Cratis applies the comment rule to everything it posts on HN, submissions included. That is
94
+ Cratis's own stricter policy, not a reading of the guidelines.
95
+
96
+ ## Not verified, removed from guidance
97
+
98
+ These appeared in earlier drafts or are commonly quoted. They weren't confirmed in the review
99
+ behind this file, so the skill doesn't rely on them. Check the live source before using any
100
+ of them.
101
+
102
+ - Buffer's "about 83% of profiles performed better when they replied" (same report as above).
103
+ - Buffer's best-time-to-post windows for LinkedIn.
104
+ - Buffer's statement that text led engagement on X in 2025.
105
+ - A Socialinsider sentence that documents and multi-image posts have "consistently
106
+ outperformed" other formats. The quarterly and yearly figures above were checked; the
107
+ sentence was not.
108
+ - LinkedIn Help's image aspect ratios, and the claim that its 1.91:1 figure applies only to
109
+ link previews and ads.
110
+ - The Show HN page's description of what qualifies.
111
+ - Quoted rules from Bluesky's community guidelines, Reddit's rules, Hashnode's code of conduct,
112
+ YouTube Help on thumbnails, and Google Search Central on AI features. The advice to read each
113
+ channel's current rules stands; the quotes were not rechecked.
114
+
115
+ ## Accessibility references
116
+
117
+ These are standards cited directly, not engagement evidence.
118
+
119
+ - Alt text for images that carry information:
120
+ [W3C images decision tree](https://www.w3.org/WAI/tutorials/images/decision-tree/).
121
+ - Captions for video: [W3C captions](https://www.w3.org/WAI/media/av/captions/).
122
+ - Contrast of 4.5:1 for normal text and 3:1 for large text:
123
+ [WCAG 2.1 contrast minimum](https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html).
124
+
125
+ ## Folklore
126
+
127
+ | Claim | Status | Best source |
128
+ | --- | --- | --- |
129
+ | "LinkedIn suppresses posts with an external link; always put it in the first comment." | Not established. The format figures compare link posts with other formats, not link placement. Keeping links out of the body is an editorial default, with an exception when the reader needs the link. | [Buffer](https://buffer.com/resources/state-of-social-media-engagement-2026/) |
130
+ | "Expanding 'see more' is a ranking signal." | Not disclosed. LinkedIn models reading, dwell and return behavior and publishes no weights; it says nothing about expansion of a single post. | [LinkedIn Engineering](https://www.linkedin.com/blog/engineering/feed/engineering-the-next-generation-of-linkedins-feed) |
131
+ | "The first 60 to 90 minutes decide a post's life." | No fixed window is published. LinkedIn describes refreshing embeddings for posts gaining engagement, and names no cutoff. | [LinkedIn Engineering](https://www.linkedin.com/blog/engineering/feed/engineering-the-next-generation-of-linkedins-feed) |
132
+ | "Saves outrank likes", "use exactly N hashtags", "matching profile keywords unlocks reach." | No weights or counts are published. | [LinkedIn Engineering](https://www.linkedin.com/blog/engineering/feed/engineering-the-next-generation-of-linkedins-feed) |
133
+ | "Carousels always get more reach" / "video is always favored." | Unsupported. The document figures are engagement rates, not reach. The SEO Works reports counting slide-advance clicks in its own carousel engagement calculation; this does not establish Buffer's or Socialinsider's calculation. The one impressions finding favors multi-image posts, and only for pages up to 50K followers. | [Buffer](https://buffer.com/resources/state-of-social-media-engagement-2026/), [Socialinsider](https://www.socialinsider.io/social-media-benchmarks/linkedin), [The SEO Works](https://www.seoworks.co.uk/downloads/data-led-analysis-of-linkedin-video-vs-carousels/) |
134
+ | "Everyone should post 2 to 5 times a week." | An observational association, not a prescription. Capacity and audience differ. | [Buffer](https://buffer.com/resources/how-often-to-post-on-linkedin/) |
135
+ | "Every post must be short" / "1,300 to 2,500 characters wins the algorithm." | Both unsupported. The longer-band result is personal-profile only and correlational. | [AuthoredUp](https://authoredup.com/blog/linkedin-character-limit) |
136
+ | "Using AI to write a post kills its reach." | Overbroad. LinkedIn's statement pairs apparent AI generation with a lack of clear perspective, and allows AI help with wording. | [LinkedIn](https://news.linkedin.com/2026/keeping-conversations-real-on-linkedin) |
137
+ | "HN is a place for polished promotional replies." | Contradicted. HN prohibits generated or AI-edited comments and says the site shouldn't be used primarily for promotion. | [HN guidelines](https://news.ycombinator.com/newsguidelines.html) |
138
+ | "A logo hurts reach" / "a logo guarantees recall." | Neither has been shown for organic developer content. The Cratis mark is an attribution rule, not a growth claim. | None found |
@@ -3,16 +3,27 @@
3
3
  "input": "Draft a LinkedIn post about a framework feature and format it for the feed.",
4
4
  "fixtures": [],
5
5
  "assertions": [
6
- { "kind": "skill-contains", "value": "A blank line spends the line budget without spending characters" },
6
+ { "kind": "skill-contains", "value": "Line wrapping and blank lines can change what fits in the preview" },
7
7
  { "kind": "skill-contains", "value": "Never use Unicode pseudo-formatting" },
8
- { "kind": "skill-contains", "value": "Assistive technology cannot read them" },
8
+ { "kind": "skill-contains", "value": "Assistive technology cannot read them reliably" },
9
9
  { "kind": "skill-contains", "value": "A brief opening sentence is a hook doing its job" },
10
- { "kind": "skill-contains", "value": "No external link in the body" },
11
10
  { "kind": "skill-contains", "value": "No engagement bait" },
12
- { "kind": "skill-contains", "value": "unofficial approximations" },
13
- { "kind": "skill-contains", "value": "Sound like a person talking" },
14
- { "kind": "skill-contains", "value": "Open with something that happened" },
15
- { "kind": "skill-contains", "value": "Put a limit where it applies" },
16
- { "kind": "skill-contains", "value": "Keep the review out of the copy" }
11
+ { "kind": "skill-contains", "value": "unofficial" },
12
+ { "kind": "skill-contains", "value": "publishes no weights for them" },
13
+ { "kind": "skill-contains", "value": "keep external links out of the body by default" },
14
+ { "kind": "skill-contains", "value": "Lead with media on LinkedIn" },
15
+ { "kind": "skill-contains", "value": "an open hypothesis that Cratis is measuring" },
16
+ { "kind": "skill-contains", "value": "Brand every asset with the Cratis mark" },
17
+ { "kind": "skill-contains", "value": "framed, never stamped" },
18
+ { "kind": "skill-contains", "value": "on every frame of a GIF, because the feed can show any" },
19
+ { "kind": "skill-contains", "value": "Leave the logo out of alt text" },
20
+ { "kind": "skill-contains", "value": "Plan for the author to answer comments" },
21
+ { "kind": "skill-contains", "value": "is rewritten for it, not cross-posted" },
22
+ { "kind": "skill-contains", "value": "Cratis's own stricter policy" },
23
+ { "kind": "skill-contains", "value": "Nothing is ever published, scheduled or replied to by an agent" },
24
+ { "kind": "skill-contains", "value": "How long the post should be: **cratis-content-length**" },
25
+ { "kind": "skill-contains", "value": "Run the voice review with **cratis-writing-voice-and-cadence**" },
26
+ { "kind": "skill-contains", "value": "belong in the same feed, and a feed where every post is the same length reads as a template" },
27
+ { "kind": "skill-contains", "value": "**cratis-developer-marketing**" }
17
28
  ]
18
29
  }