astro-pr-writer
Astro PR Writer
Write Astro pull request descriptions that help reviewers quickly understand intent, behavior changes, and validation.
Use this skill whenever the user asks for any PR-writing task, including:
- create/open a pull request
- create/open a draft pull request
- update a PR title
- update a PR body/description
- write PR notes/summary
Core Principle
Describe the change, how it works, and why it matters.
Changesexplains what the fix/feature does.Testinglists what test code was added or changed.Docsexplains whether user-facing docs changes are needed.
Do not use PR sections as a task log.
PR Title Rules
Use a human, reviewer-friendly title.
- Describe the outcome in plain language.
- Keep it concise and specific.
- Prefer phrasing a person would naturally write in a review queue.
Do not use:
- conventional commit prefixes in PR titles (
fix:,feat:,docs:, etc.) - scoped commit-style titles (
fix(cloudflare): ...)
Body Rules
Use this structure:
## Changes
- <Behavior change and why it matters>
- <Implementation detail and impact>
## Testing
- <New or changed test and what it covers>
- <Why an existing assertion changed>
## Docs
- <No docs update needed, because ...>
Changes
Focus on behavior, implementation approach, and impact.
Include:
- what now works that did not work before
- how the fix/feature works (reviewer-useful level)
- user-facing reliability/compatibility/perf behavior changes
Do not include:
- "added test" or "updated fixture" (belongs in
Testing) - "added changeset"
- internal process notes with no behavior impact
Testing
List what test code was added or changed, and why. Reviewers read this section to understand test coverage changes — not to hear that you ran a test suite.
Include:
- new test files or test cases added, with a short description of what they cover
- existing tests that were updated, and why the assertion changed
Do not include:
- that tests pass (CI shows this; it's noise)
- which commands you ran
- how many tests passed
Docs
Explain docs impact clearly.
- If docs are not needed, say why in one sentence.
- If docs are needed, link the docs PR.
Brevity Guidance
Default to short. 1-2 bullets per section is normal — add more only when the change is genuinely complex. A reviewer scanning a PR queue should be able to read the whole body in under 30 seconds for a typical patch.
Too verbose:
- Moves
.optional().prefault({})outsidez.preprocess()for theserverconfig property in bothbase.tsandrelative.ts, matching theintegrationsfix from #16531. Zod 4.4.0 rejects missing properties wrapped inz.preprocess()before the preprocessor or inner defaults can execute — moving.optional().prefault({})outside the preprocess call resolves this. Fixes theserverproperty issue reported there by @rururux.- Adds
invalid_key,invalid_element, and discriminated unionoptionshandlers to both Astro and DB error maps for Zod 4.4.0 compatibility. Zod 4.4.0 surfaces record key refinement failures (e.g. env schema variable names) as structuredinvalid_keyissues with nested errors instead of a flat message. The handlers extract the actual refinement message for clear user-facing errors.- All changes are backward-compatible with Zod 4.3.x. New error map branches only activate on issue codes that 4.4.0 starts emitting.
Better:
- Moves
.optional().prefault({})outsidez.preprocess()for theserverconfig, matching theintegrationsfix from #16531. Fixes the issue reported there by @rururux.- Adds
invalid_key,invalid_element, and discriminated unionoptionshandlers to both error maps for Zod 4.4.0 compat.- Backward-compatible with Zod 4.3.x.
Changesets
Every PR that modifies a package requires a changeset file. Only examples/* changes are exempt.
Format
Create .changeset/<descriptive-slug>.md with YAML front matter listing affected packages and bump type, followed by a plain-text description that becomes the changelog entry:
---
'astro': patch
---
Fixes a case where fonts files would unnecessarily be copied several times during the build
- Package names must match the
namefield in the package'spackage.jsonexactly (e.g.,'astro','@astrojs/node') - Bump types:
patch,minor, ormajor - A single changeset file can cover multiple packages
majorandminorbumps to the coreastropackage are blocked by CI and require maintainer review
Writing the Changeset Message
Begin with a present tense verb that completes the sentence "This PR …":
- Adds, Removes, Fixes, Updates, Refactors, Improves, Deprecates
Describe the change as a user of Astro will experience it, not how it was implemented internally:
// Too implementation-focused
Logs helpful errors if content is invalid
// Better — user-facing impact
Adds logging for content collections configuration errors.
Patch updates — one line is usually enough; no end punctuation required unless writing multiple sentences:
---
'astro': patch
---
Fixes a bug where the toolbar audit would incorrectly flag images as above the fold
New features (minor) — start with "Adds", name the new API, and describe what users can now do. Include a code example when helpful. New features are also an opportunity to write a richer description that can feed into blog posts — see https://contribute.docs.astro.build/docs-for-code-changes/changesets/#new-features for guidance.
---
'astro': minor
---
Adds a new, optional property `timeout` for the `client:idle` directive
This value allows you to specify a maximum time to wait, in milliseconds, before hydrating a UI framework component.
Breaking changes (major) — use verbs like "Removes", "Changes", or "Deprecates". Must include migration guidance; use diff code samples when appropriate:
---
'astro': major
---
Removes support for returning simple objects from endpoints. You must now return a `Response` instead.
Additional rules:
- Include the specific API name (with backtick formatting) when the change is tied to a recognizable option or function
- When the API is not user-facing, describe the use case or end result instead
- For longer changesets, use
####and deeper headings (never##or###) to divide sections — this keeps the CHANGELOG readable - Changes to default values must mention the old default, the new default, and how to restore previous behavior
Creating a Changeset
Write the changeset file manually in .changeset/ with a descriptive kebab-case slug as the filename (e.g., .changeset/fix-font-copy-on-build.md).
When Writing a PR
- Always check that a changeset exists before posting the PR
- Do not mention "added changeset" in the
Changessection — it is process noise, not a behavior change
Self-Check Before Posting
- Title is reviewer-friendly (not commit-style)
Changesbullets describe behavior/implementation/impactTestinglists test code added/changed, not test run resultsDocsdecision is explicit- Changeset file exists in
.changeset/for any package-modifying PR
More from withastro/astro
astro-developer
Comprehensive guide for developing in the Astro monorepo. Covers architecture, debugging, testing, and critical constraints. Use when working on features, fixes, tests, or understanding the codebase structure.
105triage
Triage a bug report. Reproduces the bug, diagnoses the root cause, verifies whether the behavior is intentional, and attempts a fix. Use when asked to "triage issue #1234", "triage this bug", or similar.
53analyze-github-action-logs
Analyze recent GitHub Actions workflow runs to identify patterns, mistakes, and improvements. Use when asked to "analyze workflow logs", "review action runs", or "analyze GitHub Actions".
39