Step 1 — Pull upcoming calendar entries (read-only)
Query {{calendar_source}} for entries whose scheduled date falls within
{{lookahead_days}} days of today. For each entry, pull:
- Title, description/brief, and content type (blog post, launch, product
update, announcement, event).
- Scheduled date and any linked asset (the published post, a landing page, a
changelog entry).
- The
Kortix Drafted property.
Step 2 — Skip what's already drafted
Filter out any entry where Kortix Drafted is already checked. This is the
dedup mechanism for a fresh session with no local memory — the calendar
itself is the source of truth for what's been handled.
Step 3 — Draft platform-appropriate copy per entry
For each remaining entry, write one draft per platform in {{platforms}},
following each platform's shape:
| Platform |
Length & structure |
Tone |
| LinkedIn |
3–6 short paragraphs; can explain the "why," not just the "what"; ends with a light call to action |
Explanatory, first-person-plural, low hype |
| X |
One tight post, single idea, under ~280 characters, or a short 2–4 post thread for launches with real substance |
Direct, no throat-clearing, one hook |
| Instagram |
Short caption (2–4 sentences) plus 3–5 relevant hashtags; assumes a visual carries the rest |
Casual, visual-forward |
Ground every draft in the entry's actual brief — don't invent details, stats,
or claims the calendar entry doesn't support. If an entry is too thin to draft
well (no brief, no description), skip it and note why in Step 5's post rather
than guessing.
Step 4 — Attach the scheduled date and platform tag
Label each draft with the calendar entry's title, its scheduled date, and
which platform it's for, so the reviewer can scan the batch and see what's
most urgent.
Step 5 — Post the batch to the approval channel
Post one message (or a short thread of messages) to {{approval_channel}}
containing every draft from this run, grouped by calendar entry. If an entry
was skipped for lack of context, list it separately with the reason. Post
exactly once per run — this is a fresh session, so there is nothing from a
prior run to update or merge with.
Step 6 — Mark each drafted entry in Notion
For every calendar entry you drafted for (not the skipped ones), set
Kortix Drafted to true on that entry so tomorrow's fresh run doesn't
draft it again.
1---2name: social-post-drafting3description: Daily fresh-session workflow that reads the Notion content calendar for content, launches, and announcements landing within the lookahead window, drafts platform-appropriate social posts for each one, and holds the batch with the scheduled date in the Slack approval channel. Never posts to any social account.4---56<skill name="social-post-drafting">78<overview>9Turn a Notion content calendar entry into copy that's actually ready to post,10before the scheduled date arrives instead of on it. A daily cron spawns a11fresh session with read access to `{{calendar_source}}`; this skill reads12what's coming up, drafts a platform-appropriate post per entry per platform,13and posts the whole batch to `{{approval_channel}}` for a human to review,14edit, and publish. The agent has no connector to any social platform — it15cannot publish even if asked to.16</overview>1718<when-to-load>19- The daily cron fires the social-scheduler run.20- A human asks for drafts for a specific launch, announcement, or calendar21 entry ahead of schedule.22</when-to-load>2324<workflow>2526## Step 1 — Pull upcoming calendar entries (read-only)2728Query `{{calendar_source}}` for entries whose scheduled date falls within29`{{lookahead_days}}` days of today. For each entry, pull:3031- Title, description/brief, and content type (blog post, launch, product32 update, announcement, event).33- Scheduled date and any linked asset (the published post, a landing page, a34 changelog entry).35- The `Kortix Drafted` property.3637## Step 2 — Skip what's already drafted3839Filter out any entry where `Kortix Drafted` is already checked. This is the40dedup mechanism for a fresh session with no local memory — the calendar41itself is the source of truth for what's been handled.4243## Step 3 — Draft platform-appropriate copy per entry4445For each remaining entry, write one draft per platform in `{{platforms}}`,46following each platform's shape:4748| Platform | Length & structure | Tone |49|---|---|---|50| LinkedIn | 3–6 short paragraphs; can explain the "why," not just the "what"; ends with a light call to action | Explanatory, first-person-plural, low hype |51| X | One tight post, single idea, under ~280 characters, or a short 2–4 post thread for launches with real substance | Direct, no throat-clearing, one hook |52| Instagram | Short caption (2–4 sentences) plus 3–5 relevant hashtags; assumes a visual carries the rest | Casual, visual-forward |5354Ground every draft in the entry's actual brief — don't invent details, stats,55or claims the calendar entry doesn't support. If an entry is too thin to draft56well (no brief, no description), skip it and note why in Step 5's post rather57than guessing.5859## Step 4 — Attach the scheduled date and platform tag6061Label each draft with the calendar entry's title, its scheduled date, and62which platform it's for, so the reviewer can scan the batch and see what's63most urgent.6465## Step 5 — Post the batch to the approval channel6667Post one message (or a short thread of messages) to `{{approval_channel}}`68containing every draft from this run, grouped by calendar entry. If an entry69was skipped for lack of context, list it separately with the reason. Post70exactly once per run — this is a fresh session, so there is nothing from a71prior run to update or merge with.7273## Step 6 — Mark each drafted entry in Notion7475For every calendar entry you drafted for (not the skipped ones), set76`Kortix Drafted` to true on that entry so tomorrow's fresh run doesn't77draft it again.7879</workflow>8081<guardrails>82- **No path to publish.** The agent has no connector or credential for any83 social platform. This is a scope limit, not a rule the agent has to84 remember — publishing is not something this agent is capable of doing.85- **Draft only, one output.** The Slack post to `{{approval_channel}}` is the86 only thing that leaves the sandbox. No post is scheduled, queued, or sent87 anywhere else.88- **Read-mostly on Notion.** The only write back to Notion is the89 `Kortix Drafted` checkbox used for dedup — never edit the calendar entry's90 content, date, or any other field.91- **No memory between runs.** Each run is a fresh session; the `Kortix92 Drafted` property on the calendar entry (not local memory) is what prevents93 duplicate drafts.94- **Ground drafts in real content.** Never fabricate details, numbers, or95 claims beyond what the calendar entry's brief supports.96- **People decide, not the agent.** A human reviews, edits, and publishes97 every draft through whatever tool the team already uses.98</guardrails>99100</skill>