본문으로 건너뛰기
cccskills
무료GitHub에 공개

release-digest

Prepare a release recap from changes merged since the last release tag. Group work by author, count features, bug fixes, and maintenance tasks, and post the reviewed summary to Slack for final quality checks.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

원문원문 설명 보기

Post a "what's changed since the last release" recap to the release Slack channel for final QA. Groups merged PRs by author and classifies each as feature / bug fix / task. Use when the user wants a release recap, a changelog since the last tag, or to prep QA before cutting a release from main.

연동 도구Slack
설치 방법 보기

이럴 때 유용합니다

  • Prepare a change recap for pre-release quality checks
  • Review changes included in an already-tagged pre-release
  • Share release changes grouped by author on Slack
  • Include direct commits in a release recap

포함된 파일(2)

  • SKILL.md10.6 KB
  • scripts/gather_changes.py11.3 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Release Digest

Build a human-readable recap of everything merged to main that is not yet in the latest release tag, and post it to the team's release Slack channel for final QA.

The recap is grouped by author and each change is classified as feature, bug fix, or task. This is on-demand: run it when someone asks for a release recap or wants to QA before cutting a release.

Linear ticket tracking ("which tickets are targeted for this release") is out of scope for now — punted to a later iteration. This skill only covers what's changed.


Phase 1 — Gather the change set

Run the gather script from the repo root. It fetches tags + origin/main, finds the latest tag, and lists every merged PR in the range <last_tag>..origin/main:

python3 .agents/skills/release-digest/scripts/gather_changes.py > /tmp/release_digest.json

Key design point: it uses the git commit range as the source of truth, not merge dates. A PR merged the same day a tag was cut can already be in that release, so a date filter would over-report. Trust the range.

Pre-release / already-cut releases. By default the baseline is the newest tag (git describe). But if the release you're QA'ing has already been tagged — it's a pre-release still being validated, so main is already even with it — the default range is empty. In that case pass --pre-release, which steps the baseline back one tag so the range recaps exactly what went into the pre-release:

python3 .agents/skills/release-digest/scripts/gather_changes.py --pre-release > /tmp/release_digest.json

Signs you want --pre-release: the first run reports "nothing unreleased" or "main is even with the latest tag", yet the user says a release was just cut / is being QA'd. To name the baseline explicitly instead, use --since <tag> (e.g. --since v1.0.3). The two flags are mutually exclusive. When --pre-release is used, the newest tag is the one being cut, so in Phase 3 use that tag as <new_release> rather than asking.

The JSON contains:

  • last_tag — the most recent release (e.g. v1.0.3)
  • head_ref — origin/main (or main if no remote ref)
  • pr_count, commit_count
  • prs[] — {number, title, author_name, author_login, url, labels, additions, deletions, body}
  • direct_commits[] — teammate commits pushed straight to main, no PR — {sha, title, author_login, author_name}
  • excluded_prs[] — PRs/commits from non-teammates, dropped from the recap. PR entries have a number; direct-commit entries have number: null and rely on title.
  • unresolved_prs[] — PRs whose gh pr view failed ({number, error}). If non-empty, the change set is partial — tell the user which PRs couldn't load before posting.

Only the five teammates in the script's TEAM map (Sam, Leonard, Daniel, Mike, Steve) are included in the recap. PRs from anyone else are filtered into excluded_prs rather than itemized. To add a teammate, edit TEAM in the script.

If pr_count is 0 AND direct_commits is empty: tell the user main is even with <last_tag> — nothing to QA or release yet. Do not post to Slack. Stop here. (Direct commits alone, with no PRs, still count as unreleased changes worth a digest.)


Phase 2 — Classify and group

Read /tmp/release_digest.json. Treat every item in prs[] and direct_commits[] as a change to recap (direct commits are real work that shipped — just with no PR number). Classify each into one of three buckets:

  • Feature — a substantive new product capability: new UI, a new endpoint, a new tool, new eval/RAG/fine-tune functionality, or a meaningful enhancement to how the product works. Reserve this for things a user would notice as "Kiln can now do X."
  • Bug fix — corrects broken or incorrect behavior: regressions, crashes, hangs, wrong output, security fixes.
  • Task — everything that is neither a substantive new capability nor a fix to broken behavior: refactors, docs/README, tests, CI/build, dependency bumps, version bumps, chores, internal flags, code removal/cleanup — and routine model-catalog work (see below). Matches Linear's "Task" issue type: maintenance/internal work.

Adding models is a Task, not a Feature. Kiln ships new model and provider entries constantly — "Add <model> to model list", "Add <provider> for <model>", backfilling a model on a provider, re-enabling/un-recommending a model, version bumps to a model entry. These are catalog/config maintenance, so they go in Task even though the title starts with Add/Enable. Only promote to Feature if the PR adds a genuinely new capability around models (e.g. a new thinking-level control, a new extraction modality, a new provider integration type) rather than just registering a model_id.

Decision order (use the first signal that's decisive):

  1. PR labels — bug/fix → Bug fix; feature/enhancement → Feature; chore/docs/refactor/ci → Task. (Kiln PRs are usually unlabeled, so this rarely fires — fall through to the title.)
  2. Model-catalog check — if the change just registers/edits model or provider entries (not new behavior), it's a Task, regardless of the Add/Enable verb.
  3. Conventional-commit / verb prefix in the title — fix:/Fix → Bug fix; feat:/Add /Enable (a new capability) → Feature; chore:/refactor:/ci:/ docs:/Bump /Remove /Deprecate /Version bump → Task.
  4. What the change does (read the title, and body if still unclear) — ask "does this give the user a genuinely new capability (Feature), fix something that was broken (Bug fix), or is it routine/maintenance (Task)?"

"Task" is the residual bucket, not a guess: a change lands there only because it is positively not a new capability and not a fix — e.g. Deprecate Models, min age for dependencies, Version bump, new draft readme, fix typos. When a change is genuinely ambiguous between Feature and Bug fix, prefer the one the title leans toward; only fall to Task when it's truly neither. This is a judgment call made per item — surface it to the user before posting so they can re-bucket anything.

Then group by author (author_name). Within each author, list changes by PR number, newest first; put any direct commits (no PR number) last. The feature / fix / task split is not shown per line — it only feeds the tally at the bottom.


Phase 3 — Compose the Slack message

First, get the new release name — the version being cut (e.g. v1.0.4). If you ran in --pre-release mode, the release has already been tagged, so use that newest tag (the one the script named as "the release being QA'd") as <new_release> — no need to ask. Otherwise the release isn't tagged yet and can't be derived from git, so ask the user. Use the result as <new_release> in the title.

Use this shape (Slack mrkdwn — *bold*, not **bold**):

:rocket: *v1.0.4 Release Status* :rocket:

*12 changes since v1.0.3*
_<one-to-two sentence plain-English recap of the headline changes>_

*Daniel Chiang*
• Add deprecated flag to embedding models (#1466)
• Add deprecated flag to reranker models (#1465)

*Sam Fierro*
• Dedup frozen prompts and bake type into their name (#1501)

*Steve Cosman*
• Add Jinja2 input transform on RunConfigs (#1433)
• Version bump in lock and desktop app version check

:bar_chart: *7 features · 3 fixes · 2 tasks*

:information_source: _1 PR from a non-teammate: #1456 (ianjamesburke)._

Rules:

  • Header: :rocket: *<new_release> Release Status* :rocket:, then a blank line.
  • Change count on its own line, bold: *<N> changes since <last_tag>*.
  • Recap paragraph immediately under it, wrapped in italics (_..._ around the whole paragraph) — the "what did we do" summary in plain English, not just a list. Compose it so the italics survive: write it as a single line with no hard line breaks (wrap is fine, but don't insert \n mid-paragraph — newlines break the italic span in Slack), and use no literal _ anywhere inside (an underscore would close the italics mid-paragraph — rewrite e.g. snake_case/model_id or any underscored identifier without it).
  • One bullet per change, no per-line emoji: • <title> (#<number>). Keep the title; trim trailing noise.
  • Direct commits have no PR number — render them as • <title> with nothing in parentheses (e.g. • Version bump). List them under their author, after the PRs.
  • Within each author, list newest PR first; direct commits last. Don't print the feature/fix/task bucket per line.
  • Summary block at the end, in this order:
    1. A bold :bar_chart: tally line: :bar_chart: *<X> features · <Y> fixes · <Z> tasks*.
    2. A blank line.
    3. If excluded_prs is non-empty, an italic :information_source: line noting the excluded non-teammate changes (so the omission is visible, not silent). Reference a PR entry by #<num> and a direct-commit entry (where number is null) by its title — never print #None. E.g. :information_source: _<N> change(s) from non-teammates excluded: #1456 (ianjamesburke)._
  • Link the PR numbers if easy (<url|#1501>), but plain #1501 is fine — keep it readable.

Show the composed message to the user and get confirmation before posting (it's an outward-facing post to a shared channel).


Phase 4 — Post to Slack

Post to #release (channel ID C0BDGTGBL4Q) — the team's release channel. This is the default target; only post elsewhere if the user explicitly names a different channel. (If the ID ever fails to resolve, fall back to slack_search_channels with query release to re-find it.)

Only post after the user has confirmed the composed message in Phase 3. Post with mcp__claude_ai_Slack__slack_send_message. After posting, give the user the channel name and a link/confirmation.


Checklist

  • Gather script run; /tmp/release_digest.json written
  • If pr_count is 0, reported "nothing unreleased" and stopped
  • Asked the user for the new release name (used in the title)
  • Each PR classified (feature / bug fix / task)
  • Grouped by author, recap paragraph written
  • Message shown to user and confirmed
  • Posted to #release (C0BDGTGBL4Q); confirmation returned to user

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Add AI models to Kiln or find available models missing from its list. The skill checks provider model identifiers and capabilities, updates model settings, runs tests against real APIs, and drafts a Discord announcement.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Adding a newly released model to Kiln
  • Finding available models missing from Kiln
  • Checking provider support for recently added models
Kiln-AI/Kiln5.2천2026년 10월 23일 업데이트

docs-sync

무료

Find documentation and agent instructions made outdated by a branch’s code changes. Update affected paths, commands, settings, and behavior descriptions in place, then commit the documentation fixes alongside the code in the same pull request.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Update documentation before opening a pull request
  • Review documentation before pushing more commits to an open pull request
  • Fix references after renaming scripts or public functions
Kiln-AI/Kiln5.2천2026년 10월 23일 업데이트

Draft first replies to customers and identify tickets that require human review before sending. The skill defines sensitive cases to escalate and guides replies that explain the next action, name who handles it, and match the customer's tone.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Drafting a first reply to a customer
  • Identifying tickets that need human review
  • Explaining next steps and who handles them
Kiln-AI/Kiln5.2천2026년 10월 23일 업데이트

Audit Kiln’s model list against provider APIs and catalogs to identify removed models and upcoming retirements. Get findings organized by provider, then mark affected entries as deprecated after reviewing and approving the proposed changes.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Audit Kiln’s model list for retired entries
  • Identify models approaching their retirement dates
  • Check model availability for a single provider
Kiln-AI/Kiln5.2천2026년 10월 23일 업데이트

Check whether Kiln’s base models still support fine-tuning, the process of adapting a model with additional training. Compare configured identifiers and Fireworks’ allowlist with provider information, then report unsupported entries and recommend specific updates.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Audit support for fine-tuning base models in Kiln
  • Check whether configured fine-tuning identifiers remain valid
  • Find stale entries in the Fireworks allowlist
Kiln-AI/Kiln5.2천2026년 10월 23일 업데이트

Apply Kiln’s coding rules when editing or reviewing Python, TypeScript, and Svelte. The skill combines area-specific guidance with a script that checks changed lines, plus manual checks for architecture, configuration handling, shared state, and asynchronous operations.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Checking coding rules before changing Kiln
  • Checking uncommitted changes for convention violations
  • Reviewing a branch or pull request against shared rules
Kiln-AI/Kiln5.2천2026년 10월 23일 업데이트

Kiln-AI의 스킬 모두 보기

이 스킬의 문제 신고