generating-release-content
Generating Release Content
Populate the four AI-generated fields on a release:
title_generated— self-contained news headline (60–90 chars, hard cap 100)title_short— Axios "smart brevity" headline for chrome-stripped surfacessummary— 1–2 sentence prose blurbcomposition—{bugs, features, enhancements}counts (stored onreleases.metadata.$.composition)
The fields are the same whether you're generating for the first time or rewriting after a prompt change. There is no "new vs. regen" branch in the pipeline — last write wins.
The production prompt emits two more tags this skill does not persist. Since #1696 the shared prompt also outputs <breaking> (upgrade-risk verdict: major/minor/none/unknown) and <migration> (≤3-sentence upgrade steps), persisted at ingest to releases.breaking / releases.migration_notes. The write paths this skill uses can't carry them: PATCH /v1/releases/:id is .strict() and rejects breaking/migrationNotes, and the bulk script's UPDATE only sets the four fields above. Parse and discard them locally (they'll appear in the raw output); regenerating them is ingest-only for now.
Prompt is canonical in code, not in this skill
The system prompt and all parsing rules live in packages/ai/src/release-content.ts. Read it directly; do not paraphrase it back into the user message. The same module is consumed by the ingest worker (workers/api/src/workflows/poll-and-fetch.ts), the backfill script (scripts/generate-release-content.ts, OpenRouter by default), and this skill, so any drift between local-agent output and ingest-time output starts there.
Re-export from that file: