Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Author, update, validate, and publish-ready Happier release-note story decks. Use when creating curated release notes, analyzing commits/diffs/tags to discover user-facing changes, brainstorming detailed and short release notes, adding story-deck cards, adding release-note images/videos/posters, validating translation keys and asset references, preparing happier-assets upload inputs, or updating onboarding showcase story content.
.claude/skills/happier-dev-happier-release-notes/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -1% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 20% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -8% | 0% |
This skill owns only source-coupled release-note mechanics: the canonical changelog section schema, bounded-channel projection, StoryDeck cards, translations, assets, and generation. It does not choose release scope, group changes, write editorial prose, recommend patch/minor/major, approve content, or dispatch a release.
For those decisions, start with the private maintainer release authority:
bashhmaint release bootstrap --repo <absolute checkout> --json
apps/ui/release-notes/README.md andapps/ui/release-notes/releases/README.md.
apps/ui/sources/changelog/releaseNotes/types.ts andapps/ui/sources/components/ui/storyDeck/storyDeckCardLimits.ts before changing card data or limits.
apps/ui/CHANGELOG.md is the single authored authority for one release's public Markdown and exact bounded channel text. Put this JSON comment at the start of the matching ## Release <project-release-id> - <date> section. The project release ID is a unique lowercase identifier such as 2026-08-09.1, independent of every component version. Use the date plus an ordinal, increase the ordinal for another release on that date, and keep the same ID from preview through stable. The heading is the only authored source; a workflow input only selects and verifies it:
markdown<!-- happier-release-note-projections:v1 { "expo": { "message": "Approved Expo text." }, "appStore": { "whatsNew": "Approved App Store text." }, "playStore": { "whatsNew": "Approved Play Store text." }, "storyDeck": { "summary": "Approved StoryDeck text." } } --> ## Public heading Approved public Markdown follows here.
The comment is removed from the GitHub/rolling Markdown projection. The script publishes every bounded string exactly as authored—there is no truncation, translation, synthesis, or AI rewrite. Expo is the currently consumed required projection. App Store, Play Store, and StoryDeck projections are optional until the selected release surfaces consume them; when present they are validated. Limits are: Expo 1,024; App Store 4,000; Play 500; StoryDeck 280. The section must contain meaningful public Markdown after the comment.
Project the release with its source identity and independently versioned components:
bashnode scripts/pipeline/release/release-notes/project-release-notes.mjs \ --release-id <project-release-id> \ --source-sha <40-lowercase-git-sha> \ --component-version ui=<ui-semver> \ --component-version cli=<cli-semver> \ --component-version stack=<stack-semver> \ --component-version server=<server-semver> \ --changelog apps/ui/CHANGELOG.md
The v2 bundle records { id, sourceSha, components }; it does not treat the UI version as a project-wide release identity. Workflow callers must pass the human-authored project ID, the release source SHA they already verified, and every applicable component version, then validate the v2 bundle before use.
apps/ui/release-notes/releases/<releaseId>.json only withalready-approved card content.
apps/ui/sources/text/translations/.
sources/components/ui/storyDeck/storyDeckBundledAssetRegistry.ts.
apps/ui/release-notes/assets/<releaseId>/.
apps/ui:bashyarn tsx sources/scripts/parseReleaseNotes.ts
For remote assets, build and publish only through the canonical scripts:
bashnode scripts/pipeline/release/release-notes/build-release-notes-assets.mjs node scripts/pipeline/release/release-notes/publish-release-notes-assets.mjs --dry-run
Do not upload or modify a GitHub release unless separately authorized.
bashnode --test scripts/release/release_notes_projection.contract.test.mjs cd apps/ui && yarn vitest run --config vitest.config.ts \ sources/changelog/releaseNotes/schema.test.ts \ sources/scripts/parseReleaseNotes.test.ts
These checks validate structure, source identity, selected bounded fields, and asset/translation references. They must not judge editorial wording or release selection.
Issue stage:* labels and issue comments are not release-note source. The owning release workflow reconciles availability after verification according to docs/issue-triage.md; keep editorial projection and issue lifecycle as separate consumers of the same proven release.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | fail→pass | 13,287 | 5,302 | -60% | 1 | 1 | 0% | 1,896 | 2,235 | +18% | 0 | 0 | — |
case-10 | fail→pass | 11,603 | 2,809 | -76% | 1 | 1 | 0% | 1,537 | 1,526 | -1% | 0 | 0 | — |
case-11 | fail→fail | 12,155 | 2,373 | -80% | 1 | 1 | 0% | 1,692 | 1,664 | -2% | 0 | 0 | — |
case-01 | fail→fail | 15,777 | 70,908 | +349% | 1 | 1 | 0% | 2,527 | 2,123 | -16% | 0 | 0 | — |
case-02 | fail→fail | 8,062 | 36,949 | +358% | 1 | 1 | 0% | 1,219 | 1,512 | +24% | 0 | 0 | — |
case-03 | fail→fail | 35,977 | 7,984 | -78% | 1 | 1 | 0% | 339 | 1,731 | +411% | 0 | 0 | — |
case-05 | fail→pass | 16,448 | 9,714 | -41% | 1 | 1 | 0% | 2,348 | 2,807 | +20% | 0 | 0 | — |
case-06 | fail→fail | 9,611 | 5,501 | -43% | 1 | 1 | 0% | 1,664 | 2,090 | +26% | 0 | 0 | — |
case-07 | fail→pass | 45,586 | 4,930 | -89% | 1 | 1 | 0% | 2,229 | 1,938 | -13% | 0 | 0 | — |
case-08 | pass→pass | 6,849 | 1,891 | -72% | 1 | 1 | 0% | 1,077 | 1,510 | +40% | 0 | 0 | — |
case-09 | pass→pass | 2,970 | 1,607 | -46% | 1 | 1 | 0% | 438 | 1,428 | +226% | 0 | 0 | — |
case-12 | fail→pass | 9,975 | 2,637 | -74% | 1 | 1 | 0% | 1,760 | 1,626 | -8% | 0 | 0 | — |
case-13 | fail→pass | 14,486 | 1,986 | -86% | 1 | 1 | 0% | 1,960 | 1,525 | -22% | 0 | 0 | — |
case-14 | fail→pass | 11,104 | 5,881 | -47% | 1 | 1 | 0% | 1,936 | 2,111 | +9% | 0 | 0 | — |
case-15 | fail→pass | 12,577 | 2,911 | -77% | 1 | 1 | 0% | 2,045 | 1,606 | -21% | 0 | 0 | — |
case-16 | fail→pass | 13,433 | 4,112 | -69% | 1 | 1 | 0% | 1,935 | 1,913 | -1% | 0 | 0 | — |
case-17 | fail→pass | 11,995 | 5,197 | -57% | 1 | 1 | 0% | 1,772 | 2,096 | +18% | 0 | 0 | — |
case-18 | pass→pass | 13,716 | 3,967 | -71% | 1 | 1 | 0% | 2,143 | 1,875 | -13% | 0 | 0 | — |
case-19 | fail→pass | 13,959 | 4,228 | -70% | 1 | 1 | 0% | 2,004 | 2,030 | +1% | 0 | 0 | — |
case-20 | fail→pass | 6,025 | 3,124 | -48% | 1 | 1 | 0% | 1,061 | 1,773 | +67% | 0 | 0 | — |
case-21 | pass→pass | 8,575 | 5,828 | -32% | 1 | 1 | 0% | 1,384 | 2,066 | +49% | 0 | 0 | — |
case-22 | fail→pass | 10,477 | 5,273 | -50% | 1 | 1 | 0% | 1,424 | 2,041 | +43% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +59 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/17/2026 | +73% |
| gemini-3.6-flash | verified | 8/13/2026 | +32% |
Other measured skills in the registry, with their headline benchmark lift.