frontmatter · SKILL.md+
name: publish description: > Take approved drafts — often written with the cross-post, linkedin-post, or x-thread skills — and ship them for real through Inklate: create the post, sync per-channel variants, validate against each platform's live rules, fix what can be fixed, and publish now or schedule for later. Covers LinkedIn, X (Twitter), Instagram, and Facebook. Use when the user says "publish this", "ship these drafts", "post this to LinkedIn now", or "schedule this post". Requires the Inklate MCP connection. Reads social-context.md when present to keep variants on-voice. Nothing goes out without a green preflight and an explicit yes from the user. metadata: version: 1.0.0 topics: [publishing, cross-posting] examplePrompt: "Publish these two drafts to LinkedIn and X" pairsWith: [cross-post, linkedin-post, x-thread] mcpTools: [create_post, sync_variants, preflight_post, apply_fix, publish_post, schedule_post]
Turn approved drafts into real published or scheduled posts, with per-channel validation between the draft and the send button.
Connection check
- Call
list_organizationsfirst, before touching any draft. - If the call fails or the Inklate tools are absent, tell the user to connect at
https://inklate.com/skills/connect?ref=skills-publishand STOP. - If multiple organizations are returned, ask which one to publish under before doing anything else.
Context
Read social-context.md (project root, then .agents/social-context.md) if present: the ## Voice and ## Never sections govern how you adapt variants per channel, and ## Platforms tells you the primary channel when the user is vague about targets. Proceed without it if absent — the drafts themselves are the source of truth.
Workflow
- Gather the drafts. For each one, confirm with the user which channels it targets (LinkedIn, X, Instagram, Facebook). If a target channel is not connected, say so and drop it from the plan rather than failing later.
- For each draft, call
create_postwith the content. Record the returned post ID — every later step references it. - Call
sync_variantson the post to materialize per-channel variants. Review what came back: each channel gets its own rendition, and this is where platform-specific adaptation (length, hashtags, threading) lands. - Call
preflight_poston the post. For every violation returned:- Auto-fixable: call
apply_fix, then note what changed. - Judgment calls (e.g. content must be shortened in a way that changes meaning, missing required media): present the options to the user and apply their choice via the draft content, then
sync_variantsagain. - When the fix is unclear, prefer asking over guessing: a wrong auto-shorten reads worse than one extra question.
- Auto-fixable: call
- Re-run
preflight_postuntil every targeted channel is green. If a channel cannot go green (e.g. Instagram with no media), tell the user and offer to exclude that channel. - Approval gate. Show the user the final per-channel variants verbatim — the exact text each platform will receive, per channel, plus any media attached. Ask one direct question: publish now, schedule for a time, or hold? Do not proceed on silence or on an earlier general instruction; publishing is irreversible and needs a fresh, explicit yes.
- On "publish now": call
publish_postand capture the result. - On "schedule": confirm the time in the organization's timezone, restate it unambiguously ("Tue Jul 21, 9:00 AM Europe/Berlin"), then call
schedule_postwith it. - On "hold": leave the post as a green-preflighted draft and say exactly how to resume ("say publish post_abc123 when ready").
- Verify the outcome from the tool response — status, per-channel results, permalinks where available. If any channel failed, report the exact error and offer to retry just that channel or unwind.
- When several drafts are in flight, process them one at a time through the approval gate so each yes is unambiguous about what it approves.
Quality bar
- Never call
publish_postorschedule_postwithout a green preflight on every targeted channel AND an explicit user yes given after seeing the final variants. - Always echo the per-channel variants for approval — the user approves what the platform will actually receive, not a summary of it.
- Fixes must be shown, not silently applied: every
apply_fixgets a one-line before/after in chat. - Schedule times are always stated in the organization's timezone; if the user gives a bare time, confirm the timezone before scheduling.
- Respect the
## Neversection of social-context.md as a hard filter — if a variant trips it, stop and ask. - One draft failing never blocks the others; report per-draft outcomes independently.
- Post IDs from
create_postare quoted in every status line so the user can act on any post later without re-deriving which is which.
Receipt
End with the executed action's receipt, one row per draft-channel placement:
| Post ID | Channel | Action | When (org tz) | Status | Permalink |
|---|---|---|---|---|---|
| post_abc123 | published | now | live | https://linkedin.com/... | |
| post_abc123 | X | published | now | live | https://x.com/... |
| post_def456 | scheduled | Jul 21, 9:00 AM | queued | — |
Below the table: total published, total scheduled, any channels excluded and why, and any fixes that were applied on the way to green.