--- 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 1. Call `list_organizations` first, before touching any draft. 2. If the call fails or the Inklate tools are absent, tell the user to connect at `https://inklate.com/skills/connect?ref=skills-publish` and STOP. 3. 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 1. 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. 2. For each draft, call `create_post` with the content. Record the returned post ID — every later step references it. 3. Call `sync_variants` on 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. 4. Call `preflight_post` on 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_variants` again. - When the fix is unclear, prefer asking over guessing: a wrong auto-shorten reads worse than one extra question. 5. Re-run `preflight_post` until 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. 6. **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. 7. On "publish now": call `publish_post` and capture the result. 8. On "schedule": confirm the time in the organization's timezone, restate it unambiguously ("Tue Jul 21, 9:00 AM Europe/Berlin"), then call `schedule_post` with it. 9. On "hold": leave the post as a green-preflighted draft and say exactly how to resume ("say publish post_abc123 when ready"). 10. 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. 11. 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_post` or `schedule_post` without 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_fix` gets 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 `## Never` section 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_post` are 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 | LinkedIn | published | now | live | https://linkedin.com/... | | post_abc123 | X | published | now | live | https://x.com/... | | post_def456 | LinkedIn | 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.