From ark
Generates themed Slack posts for Ark releases by aggregating changes from core and marketplace repos, validating docs links, and including upcoming sprint items from the project board.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ark:slack-announcementThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
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.
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 body
For 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 MISSING
If 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-bullet
Rule 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).npx claudepluginhub mckinsey/agents-at-scale-ark --plugin arkFormats release notes and product updates that developers actually read, covering changelog structure, versioning communication, breaking change announcements, and deprecation notices.
Takes product update descriptions and auto-generates a dated changelog entry plus a content package with tweet, LinkedIn post, email snippet, and one-liner.
Generates human-readable release notes from git history between tags, branches, dates, or commits. Groups changes by type (features, fixes, improvements) in client-friendly language.