Agent skill

Changelog Draft Generator

by warpdotdev in warpdotdev/warp

Builds a reviewable changelog draft from the PRs merged between two release cuts, with contributor attribution and Markdown and JSON outputs.

AGPL-3.0Auto-check passedDevelopment

Install Changelog Draft Generator

skills CLI
$ npx skills add warpdotdev/warp --skill changelog-draft -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install warpdotdev/warp changelog-draft --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/warpdotdev/warp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/changelog-draft .claude/skills/changelog-draft && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
changelog-draft
GitHub stars
65k
Used in
1 other repo
Token cost
~3.1k tokens
SKILL.md length
1,050 words
Files
10 (incl. scripts)
Skills in repo
46
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Builds a reviewable changelog draft from the PRs merged between two release cuts, with contributor attribution and Markdown and JSON outputs.

  • Works in 9 steps: Determine the release range → Fetch PR data → Classify contributors → …
  • Drafting release notes for a stable, preview or dev release
  • SKILL.md covers Inputs, Workflow, Constraints and Validation
  • Runs Python scripts from its folder; calls python3 and git; reaches github.com

What it does

Given a release channel (stable, preview or dev) and a release tag, this skill works out the previous release cut to compare against. Tags share a date prefix with a numeric suffix, so the base must be the first tag of the previous cut on a different date, not just the previous tag. That range is then used to fetch merged PRs with a bundled Python script that also pulls out explicit changelog markers.

Unmarked PRs are classified by the agent, and attribution can be set to external contributors only (the default), all, or none. Helper scripts handle contributor classification, issue reporters, feature flags, TUI updates, release JSON conversion and a Slack payload. When run from the internal repository, PRs are resolved back to their public originals and private changes are left out.

The result is a Markdown draft plus JSON artifacts written to the output directory, which defaults to the runner temp folder or /tmp/changelog-draft. Nothing is published, and the skill does not modify channel_versions.json.

When your agent uses it

  • Drafting release notes for a stable, preview or dev release
  • Listing external contributors for a release
  • Preparing a changelog for human review before publishing

Example prompts

  • “Draft the changelog for the latest stable release tag and credit external contributors only.”
  • “Generate release notes for the preview channel and write the JSON output to ./out.”
  • “Which PRs in this release range have no changelog marker?”

Requirements

  • Python 3
  • Access to the GitHub repository's merged pull requests

Workflow steps

9 steps, taken from the step headings in SKILL.md.

  1. Determine the release range
  2. Fetch PR data
  3. Classify contributors
  4. Extract feature flags
  5. Fetch issue reporters
  6. Classify unmarked PRs
  7. Assemble the draft
  8. Write output files
  9. Generate release-pipeline JSON

What it can do on your machine

Read from SKILL.md and the folder at commit f571865. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 8 files in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python3
    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Changelog Draft Generator loads about 3.1k tokens when it runs. Until then it costs about 67 tokens; SKILL.md has 1,050 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~67
When it runs · the whole SKILL.md, loaded when a task matches
~3.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from warpdotdev/warp at commit f571865, republished under its AGPL-3.0 licence (© warpdotdev). 1,050 words, ~3,137 tokens.

Download SKILL.mdSave it as .claude/skills/changelog-draft/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.
name
changelog-draft
description
Generate a reviewable changelog draft from PRs merged in a release range. Extracts explicit CHANGELOG markers, classifies unmarked PRs, adds external contributor attribution, and outputs markdown + JSON artifacts. Does NOT mutate channel_versions.json.

Changelog Draft Generator

Inputs

ParameterRequiredDescription
channelyesRelease channel: stable, preview, or dev
release_tagyesThe release tag to generate the changelog for (e.g. v0.2026.05.06.09.12.stable_00)
output_dirnoDirectory to write output files. Defaults to $RUNNER_TEMP or /tmp/changelog-draft
attributionnoAttribution mode: external-only (default), all, or none

Workflow

Step 1 — Determine the release range

Infer the previous release cut for comparison. Release tags follow the pattern v0.YYYY.MM.DD.HH.MM.<channel>_NN, where _NN is the RC/hotfix number within that release cut. Multiple tags can share the same date prefix (e.g. _00, _01, _02 are all part of one release cut).

The base tag must be the _00 tag of the previous release cut (i.e. a different date), not just the previous tag. For example, if generating a changelog for v0.2026.04.29.08.57.stable_01, the base should be v0.2026.04.22.08.57.stable_00, not v0.2026.04.29.08.57.stable_00.

bash
# 1. Extract the date prefix from the release_tag (everything before _NN)
release_date_prefix="${release_tag%_*}"

# 2. List all _00 tags for the channel (these are release cut points), sorted descending
git tag --list "v0.*.${channel}_00" --sort=-version:refname

# 3. Pick the first _00 tag whose date prefix differs from release_date_prefix

Record the range as previous_cut_tag..release_tag.

Step 2 — Fetch PR data

Run the fetch_prs.py script to collect all public-release PRs merged in the release range and extract explicit changelog markers. Pass the repository that the workflow checked out, not necessarily the public repository. Release workflows run from warpdotdev/warp-internal, and the script deterministically resolves warp-repo-sync[bot] PRs back to their original public warpdotdev/warp PR metadata before emitting JSON. When running from warpdotdev/warp-internal, the script intentionally omits PRs that were not authored by the repo-sync bot, because those are private internal changes that must not be exposed to the changelog agent or generated artifacts.

bash
python3 .agents/skills/changelog-draft/scripts/fetch_prs.py \
  --repo "${GITHUB_REPOSITORY:-warpdotdev/warp}" \
  --base-ref <previous_tag> \
  --head-ref <release_tag>

The script outputs JSON to stdout with this structure:

json
{
  "range": { "base": "<previous_tag>", "head": "<release_tag>" },
  "prs": [
    {
      "number": 1234,
      "url": "https://github.com/warpdotdev/warp/pull/1234",
      "title": "...",
      "commit_subject": "... (#1234)",
      "author": "username",
      "body": "...",
      "labels": ["..."],
      "merged_at": "2026-05-01T...",
      "explicit_entries": [
        { "category": "NEW-FEATURE", "text": "Added dark mode" }
      ],
      "linked_issues": [5678],
      "changed_files": ["app/src/ai/agent.rs", "crates/warp_features/src/lib.rs"],
      "source_repo": "warpdotdev/warp",
      "internal_pr": {
        "number": 25712,
        "url": "https://github.com/warpdotdev/warp-internal/pull/25712",
        "author": "warp-repo-sync[bot]",
        "title": "...",
        "repo": "warpdotdev/warp-internal"
      }
    }
  ]
}

Use the top-level number, url, commit_subject, author, body, labels, changed_files, and source_repo fields as the source of truth. internal_pr is audit-only and must never be used for contributor attribution or user-facing changelog links. If url is empty, omit the PR link from user-facing markdown rather than synthesizing one.

Step 3 — Classify contributors

Run the classify_contributors.py script with the unique author logins from Step 2:

bash
python3 .agents/skills/changelog-draft/scripts/classify_contributors.py \
  --org warpdotdev \
  --authors author1,author2,author3

Output JSON:

json
{
  "internal": ["author1"],
  "external": ["author3"],
  "bot": ["author2"],
  "unknown": []
}
Step 4 — Extract feature flags

Run the extract_feature_flags.py script to get the current flag gate lists:

bash
python3 .agents/skills/changelog-draft/scripts/extract_feature_flags.py \
  --file crates/warp_features/src/lib.rs

Output JSON:

json
{
  "release_flags": ["Autoupdate", "Changelog", ...],
  "preview_flags": ["Orchestration", ...],
  "dogfood_flags": ["LogExpensiveFramesInSentry", ...]
}
Step 5 — Fetch issue reporters

Collect all unique linked_issues from Step 2 and fetch the original reporter for each. Pass --org so the script checks org membership and filters out internal reporters automatically:

bash
python3 .agents/skills/changelog-draft/scripts/fetch_issue_reporters.py \
  --repo warpdotdev/warp \
  --org warpdotdev \
  --issues 5678,9012

Output JSON (only external reporters are included):

json
{
  "issue_reporters": [
    {
      "issue_number": 5678,
      "title": "Crash when opening large file",
      "reporter": "community-user",
      "reporter_url": "https://github.com/community-user",
      "url": "https://github.com/warpdotdev/warp/issues/5678"
    }
  ]
}

The --org flag checks each reporter's org membership via the GitHub API, filtering out internal members so they aren't misattributed as external community reporters. These reporters will be credited in the "Community" section of the changelog. Whenever the markdown draft credits a PR author, contributor, or issue reporter, render the username as a GitHub profile link such as [@username](https://github.com/username).

Step 6 — Classify unmarked PRs

Determine TUI impact independently from the regular changelog category for every PR. Explicit CHANGELOG-TUI and CHANGELOG-OZ markers are authoritative entries and may coexist with New Feature, Improvement, or Bug Fix entries. When a PR has an explicit TUI entry, preserve its other explicit entries. Otherwise, if commit_subject contains TUI as a standalone case-insensitive token, route any explicit New Feature, Improvement, or Bug Fix text to TUI instead of its regular category. This keeps clearly TUI-labeled changes out of the desktop changelog while allowing explicitly marked shared changes to appear on both surfaces.

For each PR that has no explicit CHANGELOG-* entries, decide whether to include it and under which category.

Follow the classification guidance in .agents/skills/classify-changelog-pr/SKILL.md.

For each unmarked PR, produce a classification:

json
{
  "pr_number": 1234,
  "include": true,
  "category": "IMPROVEMENT",
  "text": "Proposed changelog line",
  "impacts_tui": true,
  "confidence": "high",
  "rationale": "...",
  "feature_flag": null,
  "needs_review": false
}

Key rules:

  • PRs that only touch CI, tests, docs, or internal tooling → include: false
  • PRs behind dogfood-only feature flags → include: false for stable channel
  • PRs behind preview flags → include: false for stable, include: true for preview
  • Set impacts_tui: true when Warp Agent CLI users observe the change, including shared Agent capabilities such as tool-call or edit-file behavior
  • When in doubt, set needs_review: true and confidence: "low"
  • Bot PRs (dependabot, renovate, etc.) → include: false

Feature-flag detection: Use the changed_files list from Step 2 to check if any PR touches crates/warp_features/src/lib.rs or references a FeatureFlag variant in its title/body. Cross-reference with the flag lists from Step 4 to determine channel visibility.

Unknown contributors: Authors in the unknown bucket (org membership check failed due to auth) should be treated conservatively — do not attribute them as external. Note them in the output for manual verification.

Show full SKILL.md (355 more words)Show less
Step 7 — Assemble the draft

Combine explicit entries (Step 2) and inferred entries (Step 6) into the final report. Group by category in this order:

  1. NEW-FEATURE — New Features
  2. IMPROVEMENT — Improvements
  3. BUG-FIX — Bug Fixes
  4. TUI — TUI Updates
  5. OZ — Oz Updates

PRs marked with CHANGELOG-NONE are explicitly opted out and must never appear in the changelog markdown.

Preserve every explicit entry independently. For an inferred regular entry with impacts_tui: true, also create a TUI entry with the same user-facing text and PR metadata. Do not duplicate an inferred entry whose category is already TUI.

When creating entries, copy pr_number, url, author, source_repo, and internal_pr from the normalized PR record. The release JSON converter uses url directly; do not invent public PR URLs from PR numbers.

Step 8 — Write output files

Write two files to output_dir:

changelog-draft.md — Human-reviewable markdown, ready for Slack/Notion:

markdown
# Changelog Draft
**Channel:** stable
**Range:** v0.2026.05.01... → v0.2026.05.06...
**Generated:** 2026-05-06T15:00:00Z

## New Features
- Added dark mode ([#1234](https://github.com/warpdotdev/warp/pull/1234)) — [@external-contributor](https://github.com/external-contributor) ✨

## Improvements
- Faster tab switching ([#1235](https://github.com/warpdotdev/warp/pull/1235))

## Bug Fixes
- Fixed crash on startup ([#1236](https://github.com/warpdotdev/warp/pull/1236))

## TUI Updates
- Added inline command menus to Warp Agent CLI ([#1238](https://github.com/warpdotdev/warp/pull/1238))

## Oz Updates
- Improved agent memory ([#1237](https://github.com/warpdotdev/warp/pull/1237))

## Community
### Contributors
- [@contributor1](https://github.com/contributor1) — [#1234](https://github.com/warpdotdev/warp/pull/1234)  ✨

### Issue Reporters
Thanks to the community members who reported issues fixed in this release:
- [@reporter1](https://github.com/reporter1) — [#5678](https://github.com/warpdotdev/warp/issues/5678) "Crash when opening large file"

The markdown draft must not include "Needs Review" or "Skipped PRs" sections — those are internal details that belong only in the JSON audit artifact.

changelog-draft.json — Machine-readable audit artifact (internal only):

json
{
  "channel": "stable",
  "range": { "base": "v0...", "head": "v0..." },
  "generated_at": "2026-05-06T15:00:00Z",
  "entries": [
    {
      "pr_number": 1234,
      "url": "https://github.com/warpdotdev/warp/pull/1234",
      "category": "NEW-FEATURE",
      "text": "Added dark mode",
      "source": "explicit",
      "author": "external-contributor",
      "is_external": true,
      "confidence": "high",
      "rationale": null,
      "feature_flag": null,
      "source_repo": "warpdotdev/warp",
      "internal_pr": null
    }
  ],
  "skipped": [...],
  "needs_review": [...],
  "issue_reporters": [...]
}

The JSON artifact retains skipped, needs_review, and issue_reporters for audit purposes — every PR in the range must appear in either entries, skipped, or needs_review.

Step 9 — Generate release-pipeline JSON

Run the conversion script to deterministically produce changelog-release.json from the audit artifact:

bash
python3 .agents/skills/changelog-draft/scripts/convert_to_release_json.py \
  --input <output_dir>/changelog-draft.json \
  --output <output_dir>/changelog-release.json

This produces the flat JSON structure consumed by the create_release workflow for Slack and the in-app "What's New" dialog. Do not generate this file manually — always use the script so the output is deterministic and consistent.

Constraints

  • Never write to channel_versions.json or any production config file.
  • Never push commits, create branches, or open PRs.
  • All output goes to output_dir only.
  • The markdown draft should be copy-pasteable into Slack or Notion for review.
  • Keep the JSON artifact complete enough for audit: every PR in the range should appear in either entries, skipped, or needs_review.

Validation

After generating output, verify:

  1. Every PR in the range is accounted for (entries + skipped + needs_review = total PRs).
  2. Explicit marker entries match what fetch_prs.py extracted (no dropped markers).
  3. No duplicate PR numbers across sections.
  4. The markdown renders cleanly (no broken links or formatting).

© warpdotdev, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 9 other files (scripts) in .agents/skills/changelog-draft of warpdotdev/warp.

  • SKILL.md
  • examples/changelog-draft-example.md
  • scripts/add_tui_updates.py
  • scripts/build_slack_payload.py
  • scripts/classify_contributors.py
  • scripts/convert_to_release_json.py
  • scripts/extract_feature_flags.py
  • scripts/fetch_issue_reporters.py
  • scripts/fetch_prs.py
  • scripts/test_tui_updates.py

Open the folder on GitHubat commit f571865

Used in 1 other repository

We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in warpdotdev/warp, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Changelog Draft Generator next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Changelog Draft Generator compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Changelog Draft Generator this skillwarpdotdev/warp65k1 repos~3.1kAutomated safety check: PassAGPL-3.0
Verdaccio Pull Request Workflowverdaccio/verdaccio18k—~1.9kAutomated safety check: PassMIT
Create Cuda Python Pull RequestNVIDIA/cuda-python3.4k—~1.1kAutomated safety check: PassApache-2.0
pybind11 Release Preparationpybind/pybind1118k—~1.7kAutomated safety check: PassCustom licence
Plannotator Release Preparationbacknotprop/plannotator9.2k—~4.6kAutomated safety check: PassApache-2.0
Ansible Pull Request Reviewansible/ansible71k—~570Automated safety check: PassGPL-3.0

Similar skills

  • Takes a change through a verdaccio pull request: branch, local checks, changeset, title and body, labels, CI and review rounds, and ports to other release lines.

    18k GitHub stars~1.9k tokensUpdated today
    DevelopmentAuto-check passed
  • Official

    Create a CUDA Python pull request from an approved personal or organization-owned fork, including the GitHub CLI GraphQL fallback for renamed organization-owned forks.

    3.4k GitHub stars~1.1k tokensUpdated today
    DevelopmentAuto-check passed
  • Opens the pybind11 release-preparation pull request: picking the release base, bumping the version in common.h and integrating the changelog, following docs/release.rst.

    18k GitHub stars~1.7k tokensUpdated today
    DevelopmentAuto-check passed
  • Plannotator Release Preparation

    backnotprop/plannotator

    Drafts Plannotator release notes with full contributor credit, bumps versions in dependency order, builds, and starts the tag-driven release pipeline, in four reviewed phases.

    9.2k GitHub stars~4.6k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Reviews an Ansible pull request by number, following the steps in the project's CLAUDE.md, with early checks for changelog fragments and tests.

    71k GitHub stars~570 tokensUpdated today
    DevelopmentAuto-check passed
  • Walks a maintainer through publishing a pybind11 release after the preparation PR merges, with preflight checks, confirmations before each push and a GitHub release.

    18k GitHub stars~2.5k tokensUpdated today
    DevelopmentAuto-check passed

More from warpdotdev/warp

All 46 skills in this repo
  • Builds or updates a design system in Figma from a codebase in ordered phases: discovery, variables and tokens, components, theming and documentation, with checkpoints.

    65k GitHub starsUsed in 2 repos~4.4k tokens
    Auto-check passed
  • Required groundwork before any use_figma call: the rules and reference files for running JavaScript in a Figma file through the Plugin API without common failures.

    65k GitHub starsUsed in 4 repos~4.4k tokens
    Auto-check passed
  • Warp Factory Files

    warpdotdev/warp

    Authors and edits file-based Warp software factory definitions rooted at factory.yaml, covering agents, automations, scorers and webhooks, and validates them before a pull request.

    65k GitHub starsUsed in 1 repo~2.5k tokens
    Auto-check passed
  • Figma Design to Code

    warpdotdev/warp

    Turns a Figma frame or component into production code that matches the design, using the Figma MCP server and the project's own design system.

    65k GitHub starsUsed in 4 repos~2.9k tokens
    Auto-check passed
  • Migrates the compatible subset of settings and global file-based MCP servers from the Warp desktop app into Warp Agent CLI without exposing credentials or state.

    65k GitHub starsUsed in 1 repo~2.1k tokens
    Auto-check passed
  • Creates project-specific design system rules from your codebase so coding agents implement Figma designs with your components, naming and tokens.

    65k GitHub starsUsed in 3 repos~4.6k tokens
    Auto-check passed

Works with

Categories

Questions about Changelog Draft Generator

What does Changelog Draft Generator do?

Builds a reviewable changelog draft from the PRs merged between two release cuts, with contributor attribution and Markdown and JSON outputs. Given a release channel (stable, preview or dev) and a release tag, this skill works out the previous release cut to compare against. Tags share a date prefix with a numeric suffix, so the base must be the first tag of the previous cut on a different date, not just the previous tag.

When should I use Changelog Draft Generator?

Changelog Draft Generator fits situations like: drafting release notes for a stable, preview or dev release; listing external contributors for a release; preparing a changelog for human review before publishing.

How do I install Changelog Draft Generator in Claude Code?

Run `npx skills add warpdotdev/warp --skill changelog-draft -a claude-code`. Or copy the skill folder (.agents/skills/changelog-draft in warpdotdev/warp) into .claude/skills/changelog-draft in your project. Claude Code loads it when a task matches its description.

How do I install Changelog Draft Generator in Codex?

Run `npx skills add warpdotdev/warp --skill changelog-draft -a codex`. Or copy the skill folder (.agents/skills/changelog-draft in warpdotdev/warp) into .agents/skills/changelog-draft in your project. Codex loads it when a task matches its description.

Can I use Changelog Draft Generator in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add warpdotdev/warp --skill changelog-draft -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/changelog-draft, .gemini/skills/changelog-draft, .github/skills/changelog-draft and .opencode/skills/changelog-draft in your project.

What does Changelog Draft Generator need to run?

Going by SKILL.md and its folder, Changelog Draft Generator needs Python for the scripts in its folder and the command-line tools its instructions call (python3 and git). Our summary lists: Python 3; Access to the GitHub repository's merged pull requests.

Does Changelog Draft Generator access the network?

SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Changelog Draft Generator safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Changelog Draft Generator use?

Changelog Draft Generator is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Changelog Draft Generator use?

About 3.1k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Changelog Draft Generator?

Skills that share tags, products or a category with Changelog Draft Generator: Verdaccio Pull Request Workflow (verdaccio/verdaccio, 18k stars), Create Cuda Python Pull Request (NVIDIA/cuda-python, 3.4k stars), pybind11 Release Preparation (pybind/pybind11, 18k stars) and Plannotator Release Preparation (backnotprop/plannotator, 9.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Changelog Draft Generator?

warpdotdev (a GitHub organization) maintains it in warpdotdev/warp, which has 65,380 GitHub stars. The repository holds 46 skills in this directory. The repository was last updated on October 7, 2026.

Source: warpdotdev/warp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.