Produce a themed Slack post announcing Ark releases. Pulls from BOTH the Ark core repo (mckinsey/agents-at-scale-ark) and the Marketplace repo (mckinsey/agents-at-scale-marketplace), validates docs links, groups features by theme with relevant emoji, and ends with a "Coming next" section sourced from the current sprint on the ARK project board. Invoke when the user asks for a "release announcement", "slack post", "what's new since vX", "changelog for
76
96%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
A single Slack-ready post that summarises user-visible changes across Ark core and the Marketplace for a given window, grouped by theme, with markdown-style docs links, and a forward-looking section.
v0.1.55 → v0.1.60) or a date range. If unclear, ask.Always check both. A release in one repo often has no matching entry in the other.
# Ark core
gh release list --repo mckinsey/agents-at-scale-ark --limit 60
gh release view <tag> --repo mckinsey/agents-at-scale-ark --json body
# Marketplace (component-level tags, e.g. executor-claude-agent-sdk-v0.1.8)
gh release list --repo mckinsey/agents-at-scale-marketplace --limit 100 \
--json tagName,publishedAt \
--jq '.[] | select(.publishedAt >= "<start-date>")'
gh release view <tag> --repo mckinsey/agents-at-scale-marketplace --json bodyFor the marketplace, group component-level releases by component (e.g. executor-claude-agent-sdk: v0.1.0 → v0.1.9) and summarise the arc, not each patch.
gh api repos/<owner>/<repo>/compare/<prev>...<current> to find the genuinely new commits, not cumulative ones.Release notes carry a PR number (... ([#1215](...))). The PR's own diff is the best source of truth for which docs page documents that feature. Don't guess the URL from the feature name — pull it from the PR.
gh pr view <pr-number> --repo <owner>/<repo> --json files \
--jq '.files[].path' | grep -E '^docs/content/.*\.mdx?$|/README\.md$'Typical outputs:
docs/content/user-guide/teams/index.mdxdocs/content/developer-guide/observability.mdxdocs/content/reference/query-execution.mdxexecutors/claude-agent-sdk/README.md (marketplace — component-level docs are served from component READMEs)Both docs sites mount docs/content/ at the site root. The mapping:
docs/content/ prefix..mdx / .md suffix./index (index files map to the parent path)./.| Changed file | Published URL |
|---|---|
docs/content/user-guide/teams/index.mdx | https://mckinsey.github.io/agents-at-scale-ark/user-guide/teams/ |
docs/content/developer-guide/observability.mdx | https://mckinsey.github.io/agents-at-scale-ark/developer-guide/observability/ |
docs/content/reference/query-execution.mdx | https://mckinsey.github.io/agents-at-scale-ark/reference/query-execution/ |
For the marketplace, component READMEs are surfaced under their component namespace:
| Changed file | Published URL |
|---|---|
executors/claude-agent-sdk/README.md | https://mckinsey.github.io/agents-at-scale-marketplace/executors/claude-agent-sdk/ |
mcps/filesystem-mcp-server/README.md | https://mckinsey.github.io/agents-at-scale-marketplace/mcps/filesystem-mcp-server/ |
services/phoenix/README.md | https://mckinsey.github.io/agents-at-scale-marketplace/services/phoenix/ |
If a PR touches multiple docs pages, pick the one most specific to the bullet's user benefit. If a PR touches no docs files, skip to the fallback in 3d.
The docs sites are a Next.js SPA on GitHub Pages. The published URL works once a browser runs the JS bundle, which is what real readers get when they click a Slack link. A direct curl fetches the SPA shell and often sees "404: This page could not be found" in the body even when the page is perfectly fine. Don't treat curl-404 as "broken" — it only predicts unfurl preview quality, not link validity.
Primary validation (authoritative): confirm the source MDX file still exists on main:
# Example — verify docs/content/executors/claude-agent-sdk.mdx exists
gh api repos/mckinsey/agents-at-scale-marketplace/contents/docs/content/executors/claude-agent-sdk.mdx \
--jq '.name' 2>/dev/null && echo EXISTS || echo MISSINGIf the file exists, the URL is valid — include it.
Secondary check (informational): run curl as a preview-quality hint. If it says BROKEN, the link still works when clicked but Slack's unfurl preview may not render. That's acceptable — don't drop the link for it.
curl -sL "<url>" | grep -qi "404: This page could not be found" \
&& echo "unfurl-preview-broken (still include)" \
|| echo "unfurl-preview-ok"Use WebFetch if you want a third opinion on whether the rendered page actually matches the feature (e.g. to pick between two candidate pages touched by the same PR).
main → use the mapped URL.user-guide/teams.mdx for a team-strategy change) → verify the source file exists, then use it.https://mckinsey.github.io/agents-at-scale-ark/https://mckinsey.github.io/agents-at-scale-marketplace/Even if their source is ambiguous, these are too important to skip:
https://mckinsey.github.io/agents-at-scale-ark/reference/upgrading/ — the upgrade guide, referenced from the Upgrade notes section.Never link these pages, even if a PR touched their source file. They're either too generic to add value or actively discouraged:
https://mckinsey.github.io/agents-at-scale-ark/user-guide/dashboard/ — pick the feature-specific page instead, or drop the link.Use these buckets in this order. Drop any bucket with no content.
Pattern: • :emoji: *Feature name* — one-line benefit in plain prose. [docs](<url>)
:feather:, :rocket:, :broom:…). One per bullet.* (Slack single-asterisk bold).[docs](url) — the user explicitly prefers this over Slack's <url|text>.Shared-link hoisting. If two or more bullets in the same section would point at the same docs page, don't repeat the link — attach it to the section heading instead and leave those bullets link-free. Only bullets that point to a different page keep their own per-bullet link.
Heading-with-link format:
*:brain: Models & SDK* — [docs](https://mckinsey.github.io/agents-at-scale-ark/user-guide/models/)
• :bulb: *Native Anthropic provider* — use Claude directly without an OpenAI-compat shim, full tool-calling supported.
• :satellite_antenna: *OpenTelemetry tracing* — ... [docs](https://mckinsey.github.io/agents-at-scale-ark/developer-guide/observability/) ← different page, keep per-bulletRule of thumb:
— [docs](...) suffix.Plain-bullet example (no link on either heading or bullet):
• :bulb: *Native Anthropic provider* — use Claude directly without an OpenAI-compat shim, full tool-calling supported.:rocket: *Ark releases — what's new*
<window, e.g. "Feb 27 → Apr 21"> across Ark core and the Marketplace
Docs: [Ark](https://mckinsey.github.io/agents-at-scale-ark/) · [Marketplace](https://mckinsey.github.io/agents-at-scale-marketplace/)Every announcement ends with an "Upgrade notes" section before "Coming next". It links the upgrade guide and surfaces anything that could break an existing user in this window.
In the header of this section:
Upgrade guide: [docs](https://mckinsey.github.io/agents-at-scale-ark/reference/upgrading/)
This link is on the allowlist from step 3e — include it even though it fails curl.
The upgrade guide (docs/content/reference/upgrading.mdx in the Ark repo) is the authoritative list. Any user-impacting change is written there. Pull its commit history in the window:
gh api "repos/mckinsey/agents-at-scale-ark/commits?path=docs/content/reference/upgrading.mdx&since=<ISO-start>&until=<ISO-end>" \
--jq '.[] | "\(.sha[0:7]) \(.commit.author.date | split("T")[0]) #\(.commit.message | split("\n")[0])"'For each commit it finds, read the diff to see what was added to the guide:
gh api "repos/mckinsey/agents-at-scale-ark/commits/<sha>" \
--jq '.files[] | select(.filename == "docs/content/reference/upgrading.mdx") | .patch'Write one bullet per added guide entry. Each bullet names the change and the user action in one line.
If upgrading.mdx wasn't edited but you suspect something broke, scan commits in the window for:
!: (e.g. feat(ark)!:, refactor!:) — explicit conventional-commits break marker.BREAKING CHANGE: — conventional-commits footer.feat(...): deprecate or refactor: remove — deprecations/removals worth calling out.gh api repos/mckinsey/agents-at-scale-ark/compare/<prev-tag>...<current-tag> \
--jq '.commits[] | select((.commit.message | test("^[a-z]+(\\(.+\\))?!:")) or (.commit.message | contains("BREAKING CHANGE:"))) | "\(.sha[0:7]) \(.commit.message | split("\n")[0])"'Include these even when the upgrade guide hasn't been updated — they probably should have been, and readers still need the warning.
Still include the section, with just the upgrade guide link and a one-line reassurance:
:white_check_mark: No breaking changes this window. Full upgrade notes: [docs](...).
:warning: *Upgrade notes*
Upgrade guide: [docs](https://mckinsey.github.io/agents-at-scale-ark/reference/upgrading/)
• :no_entry_sign: *<what breaks>* — <what the user has to do>.
• :wastebasket: *<what's deprecated>* — <what replaces it, when it's removed>.Use :no_entry_sign: for hard breaks, :wastebasket: for deprecations, :arrows_counterclockwise: for migrations that happen automatically (mutating webhook etc. — still worth calling out).
Source: the currently-active iteration on the ARK GitHub Project (org mckinsey, project number 10, iteration field Sprint).
Find the current iteration:
gh api graphql -f query='
query {
organization(login: "mckinsey") {
projectV2(number: 10) {
field(name: "Sprint") {
... on ProjectV2IterationField {
configuration { iterations { title startDate duration } }
}
}
}
}
}' --jq '.data.organization.projectV2.field.configuration.iterations[0]'List items in that sprint with their status:
gh api graphql -f query='
query {
organization(login: "mckinsey") {
projectV2(number: 10) {
items(first: 100) {
nodes {
content { ... on Issue { number title } ... on PullRequest { number title } }
sprint: fieldValueByName(name: "Sprint") { ... on ProjectV2ItemFieldIterationValue { title } }
status: fieldValueByName(name: "Status") { ... on ProjectV2ItemFieldSingleSelectValue { name } }
}
}
}
}
}' --jq '.data.organization.projectV2.items.nodes[] | select(.sprint.title == "<current-sprint-title>") | "\(.status.name) | #\(.content.number) \(.content.title)"'In Progress or In review.• :emoji: *Feature name* — one-line benefit. — no docs links (these haven't shipped yet).pbcopy on macOS, xclip -selection clipboard on Linux, clip.exe on WSL.<url|text> format; use markdown [text](url).* feat(foo): bar). Translate every change into a user benefit.main (step 3c primary check).upgrading.mdx in the window (plus any !: / BREAKING CHANGE: commits not yet documented there).startDate + duration vs today).d929af7
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.