frontmatter · SKILL.md+
name: preflight description: > Run Inklate's real per-channel validation on a draft or post — the same checks that gate actual publishing, not a generic lint. Fetches each channel's live rules, runs the preflight, explains every violation in plain language, applies the auto-fixes with a before/after, and re-runs until green. Covers LinkedIn, X (Twitter), Instagram, and Facebook. Use when the user says "preflight this", "will this pass", "validate against my channels", or "fix this post for Instagram". Requires the Inklate MCP connection. Reads social-context.md when present so fixes stay on-voice. Ends with a per-channel verdict table — green, fixed-then-green, or blocked with the reason. metadata: version: 1.0.0 topics: [checking] examplePrompt: "Preflight this draft against all my connected channels" pairsWith: [post-check] mcpTools: [preflight_post, apply_fix, get_capabilities]
Validate a draft against the real rules of the user's real channels, fix what can be fixed, and deliver an honest per-channel verdict.
Connection check
- Call
list_organizationsfirst. - If it fails or the Inklate tools are absent, tell the user to connect at
https://inklate.com/skills/connect?ref=skills-preflightand STOP — a preflight against remembered platform rules is worthless. - If multiple organizations exist, ask which one; channel rules are read from that organization's connected accounts.
Context
Read social-context.md (project root, then .agents/social-context.md) if present. ## Voice and ## Never constrain how you rewrite content when fixing violations — a fix that passes the platform but breaks the voice is not a fix. Proceed without it if absent.
Workflow
- Establish scope: which channels to validate against. "All my channels" means every connected channel; a named platform (e.g. "for Instagram") means just that one. If the draft is not yet an Inklate post, create it first so preflight has a real post to check.
- For each in-scope channel, call
get_capabilitiesand note the rules the draft is most likely to trip:- Character limits (per post, and per segment when the channel threads).
- Media requirements — counts, formats, and whether media is mandatory (Instagram).
- Link and hashtag handling, and anything the channel currently flags as restricted.
- Call
preflight_poston the post for the in-scope channels. - Explain every violation in plain language. Not "VARIANT_TEXT_OVERFLOW" but "the X variant is 312 characters; X allows 280 — 32 characters need to go." One line per violation, grouped by channel.
- For each auto-fixable violation, call
apply_fix. Show the before and after for every fix — the exact text that changed, not a description of the change. If a fix would alter meaning or tone (per social-context.md), treat it as a judgment call instead. - Re-run
preflight_post. Repeat the fix-and-re-run loop until each channel is either green or only judgment calls remain. - Judgment calls become options. For each remaining violation, present 2–3 concrete resolutions ("(a) cut the third paragraph, (b) split into a 2-post thread, (c) drop X from the targets") and apply the user's choice, then re-run once more.
- If the loop is not converging — the same violation reappears after two fix attempts — stop looping, show the stuck violation, and hand the decision to the user rather than thrashing.
- Deliver the verdict. If the user's next step is publishing, point them to the
publishskill — this skill validates; it never publishes.
Quality bar
- Rules come from
get_capabilitiesand violations frompreflight_post— never from memorized platform limits, which drift. - Every
apply_fixis shown as before/after in chat; a silent fix is a bug. - Never declare green without a fresh
preflight_postrun confirming it after the last change. - Fixes preserve meaning and voice; when they cannot, the violation is escalated as a judgment call, not forced.
- A channel that cannot pass (e.g. Instagram with no media attached) gets an honest "blocked" verdict with the unblock condition — not a soft warning.
- This skill makes no irreversible calls: no publishing, no scheduling. Its output is a verdict.
- Verdicts are per-channel, never averaged: "mostly passing" is not a verdict.
- If the user asked about a channel that is not connected, say so in the verdict table rather than validating against imagined rules.
Receipt
End with the final verdict table:
| Channel | Verdict | Violations found | Fixed | Remaining |
|---|---|---|---|---|
| green | 1 | 1 (trimmed to 3000 chars) | — | |
| X | green | 2 | 2 (shortened, hashtags moved) | — |
| blocked | 1 | 0 | needs at least one image |
Below the table: the post ID that was validated, the full list of applied fixes with their before/after, any judgment calls resolved and how, and the single next action (ready to publish via the publish skill, or the unblock condition for any blocked channel).
The verdict table reflects the last preflight_post run of the session — never an earlier, more optimistic one.