Code Review
sortie-ai/sortie
Reviews pull requests in this repository for the defect classes a mechanical checklist misses: documentation that outlived the code it describes, reaction and retry state that leaks or clobbers a…
Perform a structured maintainer-style PR review for the mariadb-operator repository.
$ npx skills add mariadb-operator/mariadb-operator --skill mariadb-operator-pr-review -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mariadb-operator/mariadb-operator mariadb-operator-pr-review --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/mariadb-operator/mariadb-operator.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/mariadb-operator-pr-review .claude/skills/mariadb-operator-pr-review && rm -rf skills-srcUse ~/.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/
Install the "mariadb-operator-pr-review" agent skill from https://github.com/mariadb-operator/mariadb-operator/tree/main/.agents/skills/mariadb-operator-pr-review into .claude/skills/mariadb-operator-pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mariadb-operator-pr-review", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/mariadb-operator/mariadb-operator/tree/main/.agents/skills/mariadb-operator-pr-reviewType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add mariadb-operator/mariadb-operator --skill mariadb-operator-pr-review -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mariadb-operator/mariadb-operator mariadb-operator-pr-review --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mariadb-operator/mariadb-operator.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/mariadb-operator-pr-review .agents/skills/mariadb-operator-pr-review && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "mariadb-operator-pr-review" agent skill from https://github.com/mariadb-operator/mariadb-operator/tree/main/.agents/skills/mariadb-operator-pr-review into .agents/skills/mariadb-operator-pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mariadb-operator-pr-review", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add mariadb-operator/mariadb-operator --skill mariadb-operator-pr-review -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mariadb-operator/mariadb-operator mariadb-operator-pr-review --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mariadb-operator/mariadb-operator.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/mariadb-operator-pr-review .cursor/skills/mariadb-operator-pr-review && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "mariadb-operator-pr-review" agent skill from https://github.com/mariadb-operator/mariadb-operator/tree/main/.agents/skills/mariadb-operator-pr-review into .cursor/skills/mariadb-operator-pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mariadb-operator-pr-review", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/mariadb-operator/mariadb-operator.git --path .agents/skills/mariadb-operator-pr-review--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add mariadb-operator/mariadb-operator --skill mariadb-operator-pr-review -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mariadb-operator/mariadb-operator mariadb-operator-pr-review --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mariadb-operator/mariadb-operator.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/mariadb-operator-pr-review .gemini/skills/mariadb-operator-pr-review && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "mariadb-operator-pr-review" agent skill from https://github.com/mariadb-operator/mariadb-operator/tree/main/.agents/skills/mariadb-operator-pr-review into .gemini/skills/mariadb-operator-pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mariadb-operator-pr-review", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install mariadb-operator/mariadb-operator mariadb-operator-pr-reviewInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add mariadb-operator/mariadb-operator --skill mariadb-operator-pr-review -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/mariadb-operator/mariadb-operator.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/mariadb-operator-pr-review .github/skills/mariadb-operator-pr-review && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "mariadb-operator-pr-review" agent skill from https://github.com/mariadb-operator/mariadb-operator/tree/main/.agents/skills/mariadb-operator-pr-review into .github/skills/mariadb-operator-pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mariadb-operator-pr-review", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add mariadb-operator/mariadb-operator --skill mariadb-operator-pr-review -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install mariadb-operator/mariadb-operator mariadb-operator-pr-review --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mariadb-operator/mariadb-operator.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/mariadb-operator-pr-review .opencode/skills/mariadb-operator-pr-review && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "mariadb-operator-pr-review" agent skill from https://github.com/mariadb-operator/mariadb-operator/tree/main/.agents/skills/mariadb-operator-pr-review into .opencode/skills/mariadb-operator-pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mariadb-operator-pr-review", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
mariadb-operator-pr-reviewPerform a structured maintainer-style PR review for the mariadb-operator repository.
Mariadb Operator PR Review is an agent skill from mariadb-operator/mariadb-operator. Perform a structured maintainer-style PR review for the mariadb-operator repository. Gathers PR context, triages the change, and evaluates correctness, safety, pitfalls, backwards compatibility and code quality against the project conventions documented in AGENTS.md. Use whenever the user mentions a mariadb-operator PR number or URL and wants any kind of judgment on it — "review this PR", "what do you think of 1234", "is this safe to merge", "assess this diff", "take a look at this change" — even if they don't…
Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts. Compatibility notes: Requires GitHub API access (gh CLI or MCP tools) and the mariadb-operator repository checkout.
It sits in Development, covering Pull requests, Agent instruction files and Code quality. It works with MariaDB, GitHub, Kubernetes and Model Context Protocol. The repository describes itself as: 🦭 Run and operate MariaDB in a cloud native way. The licence is Apache-2.0.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e071201. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadGrepGlobBash(git:*)Bash(gh:*)From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
ghgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GITHUB_MARIADB_OPERATOR_TOKENGH_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Requires GitHub API access (gh CLI or MCP tools) and the mariadb-operator repository checkout.
From compatibility in the SKILL.md frontmatter.
Mariadb Operator PR Review loads about 3.3k tokens when it runs. Until then it costs about 142 tokens; SKILL.md has 1,598 words of instructions outside code blocks.
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.
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); files beside SKILL.md are not scanned.
The full file from mariadb-operator/mariadb-operator at commit e071201, republished under its Apache-2.0 licence (© mariadb-operator). 1,598 words, ~3,303 tokens.
.claude/skills/mariadb-operator-pr-review/SKILL.md (or your agent's skills folder).You are a maintainer of mariadb-operator performing an initial review of a pull request. Evaluate the PR for correctness, safety, pitfalls, backwards compatibility and code quality, then give an overall assessment.
Read AGENTS.md at the repository root before reviewing. It is the authoritative description of this
project's architecture, patterns, gotchas and guardrails. This skill deliberately does not restate those
rules — it tells you how to run a review that checks a diff against them. Throughout, "§ <name>" refers to a
section of AGENTS.md. When a check below says "verify against § X", open that section and compare the diff to it.
Whenever this skill calls GitHub — fetching PR context or delivering a review — pick the access method in this order, falling through only when the previous one is unavailable:
mcp__github-mariadb-operator__*). These may show up as
deferred tools — if so, load their schema with ToolSearch (e.g.
ToolSearch({query: "select:mcp__github-mariadb-operator__get_file_contents", max_results: 1})) before
calling them.gh CLI with the project-specific token, if the mariadb-operator MCP server isn't connected. Use
GITHUB_MARIADB_OPERATOR_TOKEN explicitly (GH_TOKEN="$GITHUB_MARIADB_OPERATOR_TOKEN" gh ...) rather than
the ambient gh auth session.mcp__github__*), if neither of the above is available.gh CLI with default credentials (plain gh auth, no explicit token) as the last resort, if none of the above work.Given a PR URL or number, collect it via the access method chosen in the GitHub credentials
section (the gh invocations below assume that method — add the GH_TOKEN override or swap in the equivalent
MCP tool as appropriate):
gh pr view <n> --json title,body,author,state,additions,deletions,files,labels,baseRefName
gh pr diff <n> # full unified diff
gh pr view <n> --json reviews,comments # existing review discussionThen, from the local checkout, pull the surrounding context the diff alone can't show:
api/v1alpha1/, internal/controller/, internal/webhook/,
pkg/controller/ — you need the before to judge behavioral change:git fetch origin <baseRefName>
git show origin/<baseRefName>:<path/to/file.go>git grep for callers of any new or changed function signature, and for users of any
renamed/removed field or type.docs/<feature>.md (§ Feature Map) — cheaper than reading code to learn intended semantics.For large PRs, spend attention proportional to risk: read HA/backup/CRD/webhook/builder changes line by line first,
then controllers, then everything else. Diff stats (gh pr diff <n> --name-only) tell you where to start.
Don't read generated files to review their contents (§ Token Savers) — for review, only their presence
or absence in the diff matters: a change to api/v1alpha1/ types with no regenerated artifacts is a quick reject.
pkg/replication, pkg/galera),
backup/restore/PITR, CRD schemas, webhooks, or pkg/builder.AGENTS.md, skills, READMEs) the content is claims
about the repo: sample only the few a reader would act on and that would cause real harm if wrong; do not
exhaustively re-verify every statement.Quick rejects — if any fire, surface it prominently up front:
api/v1alpha1/ changed, but the regenerated artifacts are missing from the diff
(§ Codegen and generated files).For each dimension give a verdict of PASS / CONCERN / FAIL. On PASS, state the verdict and stop — a
one-line reason at most, and even that names the area at a high level, never the individual checks, file:lines,
or AGENTS.md rules you verified. Do not enumerate what you checked or restate the diff. Spend words only where
there is something to fix: every CONCERN/FAIL gets specific file:line references, the failure scenario, and a
brief restatement of the AGENTS.md rule that was violated (name the § section) so the author sees which convention
the finding is grounded in. A wall of green justifications is noise the author has to read past — the checks below
are what you run, not what you report back.
On PASS, do not explicitly enumerate what you checked. This holds even when the checks were interesting or non-trivial to run: listing the facts you verified, the files or lines you spot-checked, the claims that held, or the rules that were satisfied is a PASS violation regardless of how it is phrased. Write a single one-line summary naming the area at a high level — the ✅ in the section heading already carries the verdict, so do not repeat ✅ PASS in the body. The enumeration belongs in your working notes, never in the output.
Quality bar for findings. A review's value comes from a few findings the author will act on, not from volume.
Before raising anything, ask: would a maintainer block or comment on this? Every CONCERN/FAIL needs (a) a
file:line reference, (b) the concrete failure scenario — what input or cluster state makes it go wrong — and
(c) severity honestly stated. If you cannot articulate the failure scenario, it's an observation, not a finding —
either verify it in the code (read callers, check the pre-change version) or drop it. Style opinions that
golangci-lint doesn't enforce are not findings.
Each dimension below names what to assess and which AGENTS.md section(s) hold the rules. AGENTS.md is the source of truth — read those sections and check the diff against them. Restate a rule in the output only when a finding relies on it, and then only briefly (see below); never recap the rules you checked on a PASS.
Does the code do what the PR claims, with sound control flow, valid API usage, and correct handling of edge cases (nil/empty/zero, boundaries, races, pointer/generic/interface use)? Where the diff touches a pattern documented in § Architecture and Code Patterns, verify it follows that pattern rather than re-implementing or bypassing it.
Check the diff against the applicable subsections of § Safety Guardrails, with line-by-line scrutiny of the areas it flags as dangerous.
Confirm the PR steps on none of § Gotchas and Non-obvious Rules, and re-check it against § Kubernetes best practices. Look for load-bearing assumptions that hold today but may not, and test scenarios the diff omits (§ Testing).
Check the diff against § Safety Guardrails → Backward compatibility. Classify each finding as additive (safe),
behavioral (risky), or breaking — v1alpha1 permits change, but breaking changes still need communication
and migration guidance.
Is the code well-written, maintainable and consistent with the surrounding codebase? Don't hand-verify what golangci-lint/CI already checks (§ CI — what a PR must pass); flag only what lint cannot see. Confirm tests are present and tiered per § Testing, and that the change is appropriately scoped (no dead code, leftover debug, or over-engineering).
Pick one:
Assign a risk level: LOW / MEDIUM / HIGH. Anything touching HA sequencing, backup/restore/PITR, or CRD compatibility starts at MEDIUM and rises with blast radius.
docs/ or examples/ updates without matching code.By default, reply the review back to the user in your response — do not post it to GitHub. Post it (e.g.
gh pr comment, using the access method from the GitHub credentials section) only when
the user explicitly asks you to.
Render the review as GitHub-flavored Markdown — clean enough to drop straight into a PR comment. Use the
emoji legend below so the verdict is scannable at a glance. For any dimension that is PASS, write a single
one-line summary naming the area at a high level — the ✅ in the section heading already carries the verdict, so
do not repeat ✅ PASS in the body. No file:line lists, no recap of what passed. Reserve justification,
references and failure scenarios for CONCERN / FAIL.
Emoji legend:
Use this exact structure:
## 🔍 PR Review
<1-2 sentences: what the PR does and why>
### Verdict at a glance
| Dimension | Result |
|---|---|
| Correctness | ✅ PASS |
| Safety | ✅ PASS |
| Pitfall Detection | ⚠️ CONCERN |
| Backwards Compatibility | ✅ PASS |
| Code Quality | ✅ PASS |
**Overall:** 📝 Approve with notes — **Risk:** 🟡 MEDIUM
---
### ✅ Correctness
<verdict; on CONCERN/FAIL add justification with `file:line` references and failure scenario>
### ✅ Safety
<verdict; on CONCERN/FAIL add justification with `file:line` references and failure scenario>
### ⚠️ Pitfall Detection
<verdict; on CONCERN/FAIL add justification with `file:line` references and failure scenario>
### ✅ Backwards Compatibility
<verdict; on CONCERN/FAIL bullets classifying each finding as additive / behavioral / breaking>
### ✅ Code Quality
<verdict; on CONCERN/FAIL add justification with `file:line` references>
---
### 📋 Suggested before merge
<actionable items as a checklist, or "None">Match the emoji in each dimension heading and in the summary table to that dimension's actual verdict, and set the Overall and Risk emoji accordingly — the table and the section headings must agree.
© mariadb-operator, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/mariadb-operator-pr-review of mariadb-operator/mariadb-operator.
Open the folder on GitHubat commit e071201
Mariadb Operator PR Review 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Mariadb Operator PR Review this skillmariadb-operator/mariadb-operator | 1k | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Code Reviewsortie-ai/sortie | 198 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Plane Release Notes Generatormakeplane/plane | 61k | — | ~2.5k | Automated safety check: Pass | AGPL-3.0 | |
| Git Commitsdatabasus/databasus | 8.9k | — | ~294 | Automated safety check: Pass | Apache-2.0 | |
| Link Ticket To SessionJayantDevkar/claude-code-karma | 329 | — | ~1.8k | Automated safety check: Notes | Apache-2.0 | |
| Generate Connector Docsballerina-platform/ballerina-library | 141 | — | ~4.3k | Automated safety check: Pass | Apache-2.0 |
sortie-ai/sortie
Reviews pull requests in this repository for the defect classes a mechanical checklist misses: documentation that outlived the code it describes, reaction and retry state that leaks or clobbers a…
makeplane/plane
Builds categorized release notes for a Plane release pull request from its commits and writes them into the PR description, for both the plane-cloud and plane-ee repos.
databasus/databasus
Write Databasus commit messages and branch names using the repository's release-compatible format.
JayantDevkar/claude-code-karma
Link the current Claude Code session to a ticket (Linear, Jira, GitHub Issues, or GitHub Pull Requests) and cache its title/status in karma.
ballerina-platform/ballerina-library
Generate the full WSO2 Integrator connector documentation set — overview, setup guide, action reference, and a validated example guide with six low-code UI screenshots and a preserved sample project…
nteract/semiotic
Review Semiotic pull requests for behavioral bugs, regressions, contract drift, and missing evidence.
mariadb-operator/mariadb-operator
Post a comment (or a formal PR review) to a GitHub issue or pull request in mariadb-operator/mariadb-operator.
mariadb-operator/mariadb-operator
Create the release notes and upgrade guide for a mariadb-operator release.
Categories
Perform a structured maintainer-style PR review for the mariadb-operator repository. Mariadb Operator PR Review is an agent skill from mariadb-operator/mariadb-operator. Perform a structured maintainer-style PR review for the mariadb-operator repository.
Mariadb Operator PR Review fits situations like: the user mentions a mariadb-operator PR number; URL and wants any kind of judgment on it — review this PR; what do you think of 1234; is this safe to merge.
Run `npx skills add mariadb-operator/mariadb-operator --skill mariadb-operator-pr-review -a claude-code`. Or copy the skill folder (.agents/skills/mariadb-operator-pr-review in mariadb-operator/mariadb-operator) into .claude/skills/mariadb-operator-pr-review in your project. Claude Code loads it when a task matches its description.
Run `npx skills add mariadb-operator/mariadb-operator --skill mariadb-operator-pr-review -a codex`. Or copy the skill folder (.agents/skills/mariadb-operator-pr-review in mariadb-operator/mariadb-operator) into .agents/skills/mariadb-operator-pr-review in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add mariadb-operator/mariadb-operator --skill mariadb-operator-pr-review -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/mariadb-operator-pr-review, .gemini/skills/mariadb-operator-pr-review, .github/skills/mariadb-operator-pr-review and .opencode/skills/mariadb-operator-pr-review in your project.
Going by SKILL.md and its folder, Mariadb Operator PR Review needs the command-line tools its instructions call (gh and git) and credentials named GITHUB_MARIADB_OPERATOR_TOKEN and GH_TOKEN. Our summary lists: A credential in GITHUB_MARIADB_OPERATOR_TOKEN. Its frontmatter pre-approves these tools: Read, Grep, Glob, Bash(git:*), Bash(gh:*). Compatibility (from SKILL.md): Requires GitHub API access (gh CLI or MCP tools) and the mariadb-operator repository checkout..
SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
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. Review the folder before installing.
Mariadb Operator PR Review is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.3k 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.
Skills that share tags, products or a category with Mariadb Operator PR Review: Code Review (sortie-ai/sortie, 198 stars), Plane Release Notes Generator (makeplane/plane, 61k stars), Git Commits (databasus/databasus, 8.9k stars) and Link Ticket To Session (JayantDevkar/claude-code-karma, 329 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
mariadb-operator (a GitHub organization) maintains it in mariadb-operator/mariadb-operator, which has 1,026 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 7, 2026.
Source: mariadb-operator/mariadb-operator on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.