---
name: social_post_preflight
description: Check one finished social draft before it posts, platform by platform: format and length rules, link and hashtag rules, media specs, disclosure lines, the first line and hook, and the send window, ending in a pass or fix verdict per platform. Use when a draft is written and about to be posted or scheduled to X, Instagram, LinkedIn, or Threads, when cross-posting one draft to several platforms, or when a scheduled post failed or looks wrong.
---

# Social Post Preflight

## Purpose
Catch the failures that happen after writing and before posting. A draft can read well and still fail on the day: it runs over a character limit once links are weighed, it carries a caption URL nobody can tap, it has 8 hashtags on a platform that now allows 5, its disclosure sits behind the fold, its image is the wrong shape for the publishing route, or it is scheduled in the wrong timezone. This skill runs one finished draft through dated per platform rule tables, a media spec check, and a short human check, and hands back a pass or fix verdict for each platform the draft is headed to. It does not write the draft, plan a calendar, or judge whether the idea is worth posting.

## Workflow
1. **Pin the draft and the destinations.** Save the exact text that will post, one file per platform version. Cross-posting is not one check: a draft that passes on LinkedIn can fail on X, Threads, and Instagram for three different reasons. Note the account type where it changes a rule, mainly X standard versus X Premium.
2. **Run the checker.** `python3 ~/workspace/skills/social-post-preflight/bin/preflight.py draft.txt --platform x`, with `--media <file>` for each attached file, `--alt-text "<text>"` when an image carries alt text, `--disclosure sponsored` (or gifted, or employee) when the post has a material connection to disclose, and `--scheduled <ISO time with timezone>` plus `--last-post <ISO time>` when the send time is set. Repeat for instagram, linkedin, and threads. Exit 0 is a mechanical pass, exit 1 is a fix.
3. **Check length the way the platform counts it.** Use `references/platform-rules.md`, dated 2026-10-26. The traps are counting, not writing: on X every link counts as 23 characters and emoji and CJK characters count as 2, on Threads an emoji counts as its UTF-8 bytes through the API, and everywhere blank lines and hashtags count. A Premium long post on X and a Threads text attachment both still live or die on their opening, because the rest sits behind a tap.
4. **Check links and hashtags per platform.** A URL in an Instagram caption is not clickable for most accounts, so route it to the bio link, a Story link sticker, or a DM and say which in the caption. Threads allows at most 5 links and exactly one topic tag. Instagram allows at most 5 hashtags since 2025-12-18, whatever older guides and the API reference still say about 30. X Help recommends at most 2 hashtags. LinkedIn publishes no hashtag cap, so treat tag count there as readability, not compliance.
5. **Check media against the route it will post through.** Run each file through the checker for size, format, width, and shape, then look at the real preview. App limits and API or scheduler limits differ, Instagram carousels are the standing example, so a file that posts from a phone can fail through a scheduler. Confirm one media kind per LinkedIn post, alt text on every image, and captions read by a person on every video.
6. **Check the disclosure like a reader, not a lawyer.** If the poster was paid, gifted product, discounted, employed, or related to the brand, the draft needs plain wording with the endorsement itself: Ad, Sponsored by, Paid partnership with, Gifted by, matched to the real relationship. It fails if it only says thanks, ambassador, partner, or collab, if it sits inside the hashtag block, or if a reader has to click More to find it. The FTC test and the full wording list are in the references.
7. **Read the first line and the preview on a phone.** The point has to be complete inside the part that shows before the fold: the whole post on X standard and Threads, roughly the first 125 characters on Instagram, roughly the first 210 on LinkedIn, and the first 280 of a Premium long post on X. Those fold numbers are observed, not published, so settle it in the platform preview. A first line that is a link, a hashtag, a mention, or scene setting with no point in it is a fix, however good the rest reads.
8. **Check the send window with facts from the account.** Scheduled time in the future, timezone written out and set to the audience zone, no embargo clash, nothing in the post already expired, the link verified live in a browser at send time, and spacing from the account's last post deliberate rather than accidental. For timing inside the day, use the account's own analytics for when its audience is active. No platform publishes a best time, so do not take one from a generic chart.
9. **Give the verdict per platform.** Fill in `templates/preflight-report.md`. Every fix names the exact change. A warning the checker raised can be cleared, but only with a one line reason written in the report, the way the worked examples clear the preview warnings. If any platform verdict is fix, that version does not post until the change is made and the checker runs clean on the new text.

## Output Contract
- One verdict per destination platform: PASS or FIX, never a single blended verdict for a cross-post.
- The checker output for each platform, with every error fixed in the text or listed as an open fix, and every warning either fixed or cleared with a written reason.
- The final exact text per platform, as checked, not an earlier draft.
- The media list per post with file name, dimensions, size, and alt text, or a note that the post is text only.
- The disclosure wording used and where it sits in the post, or a note that no material connection exists for this post.
- The send time with timezone, and who is covering replies in the first hour.

## Operating Rules
1. Never post a version that only passed on a different platform. Each destination gets its own run of the checker on its own final text.
2. Never invent a platform number. Limits come from `references/platform-rules.md` and its sources. If a platform's own docs today disagree with the references, the platform docs win and the references get a dated correction.
3. Never treat the observed fold points as hard limits. They are a prompt to check the real preview, nothing more.
4. Never bury a disclosure to save characters or looks. If the disclosure does not fit, cut body copy, not the disclosure.
5. Never let a scheduler truncate a post. Truncation cuts the end of the text, which is where links, tags, and disclosures tend to sit.
6. Never claim a best posting time without the account's own analytics behind it. Generic best time charts are not evidence for a specific account.
7. Never trust auto captions, auto alt text, or a link typed days earlier. Read the captions, read the alt text against the image, and open the link at send time.
8. A mechanical pass is not approval to post. Claims in the draft still need to be true, handles still need to be the right handles on that platform, and a human still owns the final send call.
9. Style law for any text this skill generates or rewrites: no em dashes, no hype words such as delve, tapestry, unlock, supercharge, or game-changer, no press release tone. Plain and direct.

See `references/platform-rules.md` for the dated rule tables and disclosure test, and `references/worked-examples.md` for pass and fail drafts on all four platforms with the checker output for each.
