release-notes
Produces a Slack-ready QA guide (guide de recette) for pilots, from a git diff between two tags. Focuses on cross-cutting attention points, risk zones, and side effects — not ticket acceptance criteri
Files2
View on GitHubSKILL.md.claude/skills/release-notes/SKILL.md
GitHubPurpose
Produce a Slack-ready QA guide for pilots (testers). This guide does not reproduce the acceptance criteria of Jira tickets — pilots already know how to test each ticket. Its value lies elsewhere:
- Provide the global context of the release (what changed, the scope)
- Flag cross-cutting attention points: zones touching multiple tickets, silently changing behaviors, edge cases to watch
- Identify potential side effects: regressions in existing features not described in the tickets
Think like a QA architect reading the full diff and anticipating what could break — not like a scribe copying tickets.
Step 1 — Fetch commits
git log --pretty=format:"%h %s" <tag-from>..<tag-to-or-HEAD>
If the user does not specify tags, ask: "Depuis quel tag ? (ex: v2.20.64-hotfix)"
Feature branch merges
When a commit looks like Feature: X (#NNN) or feat: X (#NNN) without an IDF-XXXX ref, it is likely a feature branch merge commit containing sub-commits. Always drill into it:
git log --pretty=format:"%h %s" <merge-hash>^1..<merge-hash>
In the ✨ FEATURES section, give each feature branch its own bold title line (not a bullet) with audiences, followed by a flat list of its tickets. End with a Autres tickets bold title for remaining individual commits:
**[Feature name]** · 👤 Jeune / 🏪 Partenaire
- [IDF-XXXX](url) — short title
- [IDF-XXXX](url) — short title
**Autres tickets**
- [IDF-XXXX](url) — short title
Do not list the feature branch merge commit itself.
Step 2 — Classify ALL commits (exhaustiveness is mandatory)
Golden rule: every commit must appear in exactly one of the lists below. No commit can be lost.
List A — Features & bugs (commits with IDF-XXXX)
Group by ticket: multiple commits on the same IDF-XX → one single item.
Distinguish:
- Feature (
feat) →✨ FEATURESsection - Bug (
fix) →🐛 CORRECTIONSsection - Refactor / chore with IDF- → feature or bug depending on ticket context; if uncertain, classify as feature
List B — AI & tooling (commits related to AI, agent skills, AGENTS.md)
Commits that advance AI integration in the team's workflow: new skills, AGENTS.md, agent documentation, AI-generated characterization tests, Copilot/Claude tooling.
→ 🤖 IA & OUTILLAGE section
List C — Continuous improvements (other commits without IDF-XXXX)
Commits without a ticket reference that improve the platform: refactors, performance, technical tooling, debt, small UX improvements without an associated ticket. Some may be visible (e.g. better error handling, perceived perf), others not.
→ 🔧 AMÉLIORATIONS section
List D — Ambiguous (commits without IDF-XXXX but resembling a visible feature or bug)
Do not classify these alone. Before producing the guide, present the ambiguous commits to the user and ask explicitly for each one:
"Ces commits n'ont pas de ticket IDF- mais semblent avoir un impact visible. Peux-tu me dire s'ils vont dans Nouveautés, Corrections ou Améliorations techniques ?"
Wait for the answer before continuing. Do not guess, do not ignore.
Commits to exclude (do not count toward exhaustiveness)
- Automatic merge commits (
Merge pull request #NNN,Merge branch '...') - Lock file updates (
pnpm-lock.yaml,package-lock.json) - Purely internal dev typo fixes (e.g. "fix typo in mapper")
Step 3 — Analyze the release globally (for the attention sections)
Before writing, identify:
- Domains touched — which libs, which modules (auth, grants, offers, wallet, Keycloak…)
- Cross-cutting changes — modifications impacting multiple features or multiple audiences at once
- Risk zones — refactors, auth changes, data migrations, silently changing behaviors
- Probable side effects — e.g. a Keycloak flow refactor can affect FranceConnect login even if the ticket doesn't mention it
Item classification in the guide
→ 🔧 AMÉLIORATIONS section if no IDF-XXXX reference is present in the message AND the commit has no visible UX impact.
→ ⚠️ / 🔴 / 🟡 sections if the commit contains an IDF-XXXX reference OR describes a user-visible change.
Edge cases:
- Commit without
IDF-XXbut with an obvious UX impact → 🟡 or ⚠️ depending on risk - Commit with
IDF-XXbut purely technical (e.g.refactor(IDF-1700): cleanup Keycloak module) → 🔴 (refactor on sensitive domain)
Risk levels
| Level | Criteria |
|---|---|
| 🔴 High | Refactor on auth / Keycloak / identity / payment, large multi-PR feat, anything touching registration, login, or sensitive data |
| 🟡 Medium | Standard product feature with potential interactions with existing behavior |
Audience rules
| Signal in commit | Audience |
|---|---|
young, jeune, app |
👤 Jeune |
partner, partenaire |
🏪 Partenaire |
agent, back-office, agents |
🧑💼 Agent |
Multiple audiences are possible on the same item.
Step 4 — Jira links
For every IDF-XXXX reference found in a commit:
→ URL: https://zenstudio.atlassian.net/browse/IDF-XXXX
Step 5 — Produce the guide in Slack format
The guide must start with the Power Ranger opener defined in the slack-notify skill (1 sentence, French, subtle Power Rangers lore reference). See that skill for exact rules.
Use the template at assets/template.md as the base structure. Key formatting rules:
- Section titles (✨ FEATURES, 🐛 CORRECTIONS, etc.) must be bold: e.g.
✨ **FEATURES** - The release title must be bold:
🚀 **Release vX.XX.XX — Guide de recette** - CONTEXTE must be bold too
Key rule for ⚠️ / 🔴 / 🟡 sections:
- Written for pilots (testers), not developers — avoid implementation details, code names, database terms
- Do not rewrite ticket acceptance criteria
- Focus on: what areas are impacted, what could regress, what to re-test beyond the ticket scope
- Tone: "ce changement a des répercussions sur X, pensez à retester Y" — not "la colonne Z est supprimée de la table W"
- All information for one bullet must be on a single line (no nested sub-items)
Intro phrase for 🔧 AMÉLIORATIONS
Pick one of the following (or generate a similar one in the same spirit):
Cette release embarque également des améliorations qui renforcent la robustesse et la performance de la plateforme :
En parallèle des nouveautés, cette release consolide les fondations techniques de la plateforme :
Cette release intègre aussi plusieurs chantiers qui améliorent la stabilité et la maintenabilité :
Rule: positive and dynamic. Adapt if improvements concern a specific domain (e.g. "…renforcent la robustesse du module d'authentification"). Do not write "nothing visible" or "invisible to users".
Formatting rules
When posting via the slack-notify skill (MCP)
The MCP conversations_add_message accepts text/markdown by default and converts automatically. Use standard Markdown:
- Links:
[IDF-1670](https://zenstudio.atlassian.net/browse/IDF-1670) - Bold:
**text** - Italic:
_text_ - Bullet:
- - Section headers: no
#— use emojis as separators - Line breaks between sections: one blank line is enough
⚠️ Slack collapses single newlines. Every line that must be visually separate needs a blank line after it — including title lines, the opener, "Diff depuis :", and section headers. Without a blank line, the next line is appended inline.
Example — correct:
🚀 **Release vX.XX.XX — Guide de recette**
Diff depuis : `<tag>`
**CONTEXTE**
...
⛔ What causes an invalid_blocks error and is FORBIDDEN via MCP:
---(horizontal dividers) — generates an unsupported block, the message fails- Nested lists / indented sub-items (e.g. a
-followed by an indented→) — Slack Block Kit does not support nesting, the message fails - If you need to add sub-information to a list item, include it inline on the same line, separated by
—
Golden rule: all lists must be flat (single depth level). When in doubt, avoid any Markdown construct that generates more than one level of nested blocks.
Default: always produce the guide in standard Markdown — the MCP conversations_add_message accepts text/markdown and converts correctly. Do not use Slack mrkdwn (*bold*, <url|text>, •) — use standard Markdown at all times.
Constraints
- Never reproduce the acceptance criteria of a Jira ticket
- Do not include: automatic merge commits, lock file updates, internal dev typo fixes
- If multiple commits relate to the same
IDF-XX, merge them into a single item - If no item fits a section, omit the section entirely
- The
🤖 IA & OUTILLAGEsection is optional — include it only if the release contains commits related to AI, agent skills, or AGENTS.md - The
🔧 AMÉLIORATIONSsection is optional — omit it if there are no technical commits without a Jira ref - The ⚠️ and 🔴 sections are the most important — if the release is quiet, they can be empty or absent