Codebase Modernizer
luongnv89/skills
Audit a stale, inherited, or messy codebase — deps, bugs, security, tests, CI, docs, UI/UX — then emit a phased, testable modernization plan.
Bring the base that every dispatched unit is cut from up to date before the first dot-agent-deck dispatch of a batch in this repo, and check the base dispatch reports afterwards.
$ npx skills add vfarcic/dot-agent-deck --skill dispatch-base -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install vfarcic/dot-agent-deck dispatch-base --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/vfarcic/dot-agent-deck.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/dispatch-base .claude/skills/dispatch-base && 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 "dispatch-base" agent skill from https://github.com/vfarcic/dot-agent-deck/tree/main/.claude/skills/dispatch-base into .claude/skills/dispatch-base/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dispatch-base", 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/vfarcic/dot-agent-deck/tree/main/.claude/skills/dispatch-baseType 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 vfarcic/dot-agent-deck --skill dispatch-base -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install vfarcic/dot-agent-deck dispatch-base --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vfarcic/dot-agent-deck.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/dispatch-base .agents/skills/dispatch-base && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "dispatch-base" agent skill from https://github.com/vfarcic/dot-agent-deck/tree/main/.claude/skills/dispatch-base into .agents/skills/dispatch-base/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dispatch-base", 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 vfarcic/dot-agent-deck --skill dispatch-base -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install vfarcic/dot-agent-deck dispatch-base --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vfarcic/dot-agent-deck.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/dispatch-base .cursor/skills/dispatch-base && 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 "dispatch-base" agent skill from https://github.com/vfarcic/dot-agent-deck/tree/main/.claude/skills/dispatch-base into .cursor/skills/dispatch-base/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dispatch-base", 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/vfarcic/dot-agent-deck.git --path .claude/skills/dispatch-base--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 vfarcic/dot-agent-deck --skill dispatch-base -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install vfarcic/dot-agent-deck dispatch-base --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vfarcic/dot-agent-deck.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/dispatch-base .gemini/skills/dispatch-base && 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 "dispatch-base" agent skill from https://github.com/vfarcic/dot-agent-deck/tree/main/.claude/skills/dispatch-base into .gemini/skills/dispatch-base/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dispatch-base", 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 vfarcic/dot-agent-deck dispatch-baseInstalls 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 vfarcic/dot-agent-deck --skill dispatch-base -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/vfarcic/dot-agent-deck.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/dispatch-base .github/skills/dispatch-base && 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 "dispatch-base" agent skill from https://github.com/vfarcic/dot-agent-deck/tree/main/.claude/skills/dispatch-base into .github/skills/dispatch-base/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dispatch-base", 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 vfarcic/dot-agent-deck --skill dispatch-base -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install vfarcic/dot-agent-deck dispatch-base --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vfarcic/dot-agent-deck.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/dispatch-base .opencode/skills/dispatch-base && 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 "dispatch-base" agent skill from https://github.com/vfarcic/dot-agent-deck/tree/main/.claude/skills/dispatch-base into .opencode/skills/dispatch-base/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dispatch-base", 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.
dispatch-baseBring the base that every dispatched unit is cut from up to date before the first dot-agent-deck dispatch of a batch in this repo, and check the base dispatch reports afterwards.
Dispatch Base is an agent skill from vfarcic/dot-agent-deck. Bring the base that every dispatched unit is cut from up to date before the first dot-agent-deck dispatch of a batch in this repo, and check the base dispatch reports afterwards. Fetches, fast-forwards main when there is no local work to move, and otherwise leaves the checkout alone and reports which precondition failed and how far HEAD is from origin/main. Use whenever you are about to run dot-agent-deck dispatch in this repo for any reason: an ad-hoc "start X as a separate line of work" in a dispatcher pane…
Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Product & Project Management, covering PRD writing and Pull requests. It works with Git. The repository describes itself as: A rich terminal dashboard for monitoring and controlling multiple AI coding agent sessions. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 8808915. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use 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 no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Dispatch Base loads about 3.1k tokens when it runs. Until then it costs about 176 tokens; SKILL.md has 1,785 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 vfarcic/dot-agent-deck at commit 8808915, republished under its MIT licence (© vfarcic). 1,785 words, ~3,098 tokens.
.claude/skills/dispatch-base/SKILL.md (or your agent's skills folder).This is where the base step for every dispatch in this repo is defined: an ad-hoc request in a dispatcher pane, /issue-queue, /prd-queue, /pr-review-queue, /code-cleanup, or a skill written later. The queues used to carry their own copies of it; issue #1638 moved it here after an ad-hoc dispatch, which had no copy at all, cut three units from the wrong branch. A dispatching skill says when in its own flow to run this and where to carry a refusal; what the step does is here.
HEAD is the base, and nothing else isdispatch has no base or branch option. It resolves the caller's HEAD to a commit once, then runs git worktree add <dir> -b agent/dispatch-<name> <that sha> in the caller's own working directory (resolve_dispatch_base and create_dispatch_worktree in src/dispatch.rs, feeding create_worktree_from in src/issue_dispatch_run.rs), and reports that same sha in its cut from <branch> at <sha> reply. So whatever the dispatcher checkout has checked out at dispatch time is the base every unit inherits, and no flag overrides it.
Updating the local main ref while another branch is checked out changes nothing for a unit. git fetch origin main:main and git branch -f main origin/main move a ref that dispatch never reads. Only what HEAD points at counts.
What getting that wrong cost, on 2026-10-10. A dispatcher pane was asked to dispatch PRDs #1631, #1401 and #1258 while its checkout was on prd/1487-shared-daemon-upgrade. The agent ran git fetch origin main:main, took that as the base, and dispatched. All three units were cut from the feature branch, 19 commits behind origin/main and carrying one commit that was not on main; #1631's unit lacked #1617, the PR its PRD builds on, while its task said #1617 was present. All three were stopped, their worktrees and branches deleted, and the batch re-dispatched. dispatch's own reply had said cut from prd/1487-shared-daemon-upgrade at 0935e2a7, which is why step 4 exists.
What a stale main cost, on 2026-08-30. Two units were dispatched from a local main at 820ba40, six commits behind origin/main at 83d9bf3. One of those six was daf94f0, the commit that introduces desktop/, and both units had been dispatched to work on the desktop app. They were cut from a tree with no desktop/ directory, could not have done anything, and were re-dispatched after a pull with not one original commit between them. A unit cannot discover this about itself. It sees a valid checkout, finds the code its task names missing, and reasonably concludes that the task is stale rather than its base.
Once before the first dispatch of a batch, never between two. A batch is every unit dispatched for one request: one ad-hoc ask, or one queue run. Updating mid-batch splits it across two bases, and the units already started keep the old one. A later, separate request is a new batch and runs this again.
A dispatching skill may say otherwise for its own flow. /issue-queue re-runs it before every dispatch when its bug-fix units merge their own PRs, because there the loop itself moves main between dispatches; that exception, and why, is in its step 0.
git fetch origin --quiet
git rev-parse --abbrev-ref HEAD # the branch every unit is cut from
git status --porcelain --untracked-files=no # ANY output means tracked changes
git rev-list --left-right --count HEAD...origin/main # "0 6" is 0 ahead, 6 behindA skill that fetched in an earlier step of its own does not need to fetch again, as long as nothing has run in between that could have moved origin/main.
When HEAD is main, that status output is empty, and the ahead count is 0, fast-forward it and say you did. No prompt and no question: an up-to-date base is the default here, and the user is told what happened rather than asked to authorise it. Print the sha before moving, so the report can say where the base was, and again after, since that is the base the units inherit.
git rev-parse --short HEAD # the sha before moving
git merge --ff-only origin/main
git rev-parse --short HEAD # the sha after: the units' baseWhen step 3 declines to move, the base is HEAD as step 1 left it: record git rev-parse --short HEAD then, with the distance step 1 read.
Why this is safe. The hazard behind the older rule, which surfaced staleness and asked every time (until issue #760), was that the user may have local work, and a dispatching agent has no business moving their branch. That hazard is kept: it is what the three preconditions test for. Together they say there is no local work here to move: no uncommitted tracked change, no commit that is not already on the remote, and the branch is the one the remote's is. A fast-forward under them rewrites nothing, discards nothing, creates no merge commit, and is undone exactly by git reset --hard <the sha you printed before moving>.
git merge --ff-only origin/main, never git pull. The fetch already put the ref in the repository, so the merge is purely local: no second network round trip, and nothing for a pull.rebase setting to reinterpret into a rebase of the user's branch. It is also the second of two independent guards: the preconditions decide and --ff-only enforces, so if the two ever disagree the merge fails instead of writing a merge commit onto main.
When the base cannot be brought up to date, do not touch the checkout. Three of the four cases below are precondition failures and the fourth is the merge itself refusing. Say which one it was, with the distance from origin/main, in these terms:
docs/dispatcher-mode.md), so uncommitted work never reaches one. Committing or stashing is the user's to do, not yours. Untracked files are deliberately not a blocker, which is why --untracked-files=no is in step 1: a fast-forward that would clobber one fails cleanly by itself, and counting them would refuse on nearly every real checkout.HEAD is not main: every unit is cut from that branch and carries its unmerged work into every PR the batch produces. Name the branch and its distance from origin/main. This is the sharpest of the four, because nothing about it looks wrong: a feature branch dispatches exactly as smoothly as main does. It is the 2026-10-10 case above.HEAD is ahead of origin/main: there is nothing to fast-forward to, and the commits that put it ahead are inherited by every unit's branch and turn up in every unit's PR. Report the count; pushing or moving is the user's call.origin/main newly tracks is the concrete case. Report the git error and do not dispatch. Decide on the exit status, never on the output: git writes Updating <old>..<new> to stdout and the refusal to stderr, so captured output of a refusal can end in that line, after Aborting, reading exactly like a successful fast-forward. --ff-only never partially applies, so the checkout is unchanged and there is nothing to undo.git log --oneline HEAD..origin/main names the commits behind the count, which makes a refusal something the user can act on rather than a number.
The next move is the user's, and there are three legitimate ones: dispatch anyway onto the older base, clear the blocker and dispatch after it, or defer the batch. Take their answer rather than picking one, and never clear the blocker on their behalf: committing, stashing or switching branch is the local work this step refuses to touch. If they clear it, run step 1 again before dispatching. Ad hoc, put the refusal to them before the first dispatch. A queue skill says where it carries the refusal instead, usually to the moment it asks how many units to dispatch, because its selection works from origin/main and does not depend on the checkout.
dispatch reportsdispatch's success line ends with the base it cut the worktree from (resolve_dispatch_base in src/dispatch.rs):
dispatch: spawned isolated agent for '<name>' in <dir>, cut from main at c701932Read that clause on every dispatch, and compare its sha with origin/main:
git rev-list --left-right --count <sha>...origin/main # "0 0" is origin/main itselfTreat any of these as a finding to report, not as noise:
main, or detached HEAD at <sha>;origin/main, unless the user chose to dispatch onto an older base after a step 3 refusal, in which case report the distance they chose;HEAD that failed, in which case dispatch cut the worktree from HEAD without naming it. It is never a base that is fine. Fall back to the branch's own record below, and say the clause was missing.When the clause is missing, read the commit the unit's branch was created at from its first reflog entry, which later commits in the unit do not change. Take the branch from the worktree the success line names rather than from the name you passed: dispatch sanitizes the name before it builds the branch, so fix auth becomes agent/dispatch-fix-auth. Read it right after the dispatch, before the unit has had time to switch branch:
branch=$(git -C "<dir>" rev-parse --abbrev-ref HEAD) # <dir> from the success line, quoted
git reflog show --format='%h %gs' "$branch" | tail -1 # "<sha> branch: Created from <...>"Use that sha only when the subject starts branch: Created from. It reads Created from HEAD when dispatch cut the worktree with no start-point, which is what a missing clause means, and Created from <full sha> when it passed the sha it reported. An empty result or any other subject means the reflog cannot answer, because it is disabled, expired or was rewritten. Then say the base could not be verified, and do not report a sha.
On a build older than the fix for issue #1643, the clause was a probe of HEAD read just before a git worktree add that read HEAD again, so the two could differ if HEAD moved in between; the reflog sha is the base there. A current build cuts the worktree from the sha it reports, so the clause is the base.
Catching it here costs one stopped unit, before the unit has spent any time working from the wrong tree.
origin/mainWherever the dispatching skill or the ad-hoc reply says where the work went, give the base as the sha plus 0 behind (after step 2 fast-forwarded it, or when it was already current) or N behind (when step 3 declined to move it), measured at the moment of dispatch. Quote dispatch's own cut from … at <sha> clause rather than recomputing it. Report it when the base was current too: nothing else tells a base that was checked from one nobody looked at, and "cut from main" reads identically whether main is level with the remote or six commits behind it.
© vfarcic, MIT. 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 .claude/skills/dispatch-base of vfarcic/dot-agent-deck.
Open the folder on GitHubat commit 8808915
Dispatch Base 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 |
|---|---|---|---|---|---|---|
| Dispatch Base this skillvfarcic/dot-agent-deck | 109 | — | ~3.1k | Automated safety check: Pass | MIT | |
| Codebase Modernizerluongnv89/skills | 131 | — | ~5k | Automated safety check: Pass | MIT | |
| CCPM Project Managementautomazeio/ccpm | 8.4k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Astro Code Reviewwithastro/astro | 63k | — | ~7.6k | Automated safety check: Pass | Custom licence | |
| Reviewfossasia/eventyay-interpretation | 1.6k | 35 repos | ~996 | Automated safety check: Pass | Apache-2.0 | |
| Pi Enshare-skills/pi | 108 | — | ~9.9k | Automated safety check: Warn | Apache-2.0 |
luongnv89/skills
Audit a stale, inherited, or messy codebase — deps, bugs, security, tests, CI, docs, UI/UX — then emit a phased, testable modernization plan.
automazeio/ccpm
Runs a spec-driven workflow from PRD to epic to GitHub issues to parallel agents, with status, standup and blocked-work reports from bundled scripts.
withastro/astro
Perform a static, read-only code review of an Astro pull request or of a local branch, commit range, diff, patch, or working tree being prepared as a pull request.
fossasia/eventyay-interpretation
Review the changes since a fixed point (commit, branch, tag, or merge-base) along two axes — Standards (does the code follow this repo's documented coding standards?) and Spec (does the code match…
share-skills/pi
PI Cognitive AI. An agent skill from share-skills/pi.
yunshu0909/yunshu_skillshub
已有功能的需求变更闭环(门禁式七步)。触发硬条件:要改的功能已经实现并跑起来了。当用户说"改需求""需求变更""调整交互""改功能""重构流程",或改动容易散到多个文件、碰到鉴权/存储/配置/权限、需要可靠验证 + 回滚方案时使用。流程:锁 scope 写 change brief → 从代码确认当前行为(不靠记忆和假设)→ 影响面与风险评估 + 回滚计划 →…
vfarcic/dot-agent-deck
Choose the shape of a unit you are about to dispatch in this repo — one agent (--single) or a team (--orchestration '<name') — from divisibility criteria instead of asking, and report the shape you…
vfarcic/dot-agent-deck
Check that a change to the user-facing docs covers both clients (the TUI and the desktop app) unless the feature exists in only one, and decide whether it needs a new or updated screenshot, then…
vfarcic/dot-agent-deck
Generate a feature request prompt for another dot-ai project.
vfarcic/dot-agent-deck
Take committed work from a branch to a verified pull request — push, open the PR, settle CI and the automated review, answer and resolve every finding, and hand off.
vfarcic/dot-agent-deck
Publish the docs site to GHCR with a main-<sha tag and bump site/helm/values.yaml so Argo CD picks it up — without cutting a SemVer release.
vfarcic/dot-agent-deck
Run, build, smoke-test, and screenshot the dot-agent-deck binary against an isolated sandbox.
Works with
Categories
Bring the base that every dispatched unit is cut from up to date before the first dot-agent-deck dispatch of a batch in this repo, and check the base dispatch reports afterwards. Dispatch Base is an agent skill from vfarcic/dot-agent-deck. Bring the base that every dispatched unit is cut from up to date before the first dot-agent-deck dispatch of a batch in this repo, and check the base dispatch reports afterwards.
Dispatch Base fits situations like: you are about to run dot-agent-deck dispatch in this repo for any reason: an ad-hoc start X as a separate line of work in a dispatcher pane; /pr-review-queue; any other skill that dispatches.
Run `npx skills add vfarcic/dot-agent-deck --skill dispatch-base -a claude-code`. Or copy the skill folder (.claude/skills/dispatch-base in vfarcic/dot-agent-deck) into .claude/skills/dispatch-base in your project. Claude Code loads it when a task matches its description.
Run `npx skills add vfarcic/dot-agent-deck --skill dispatch-base -a codex`. Or copy the skill folder (.claude/skills/dispatch-base in vfarcic/dot-agent-deck) into .agents/skills/dispatch-base 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 vfarcic/dot-agent-deck --skill dispatch-base -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dispatch-base, .gemini/skills/dispatch-base, .github/skills/dispatch-base and .opencode/skills/dispatch-base in your project.
Going by SKILL.md and its folder, Dispatch Base needs the command-line tools its instructions call (git).
SKILL.md contains no URLs. Its commands use 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.
Dispatch Base is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.1k tokens (SKILL.md is roughly 12k 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 Dispatch Base: Codebase Modernizer (luongnv89/skills, 131 stars), CCPM Project Management (automazeio/ccpm, 8.4k stars), Astro Code Review (withastro/astro, 63k stars) and Review (fossasia/eventyay-interpretation, 1.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
vfarcic (a GitHub user) maintains it in vfarcic/dot-agent-deck, which has 109 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 11, 2026.
Source: vfarcic/dot-agent-deck on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.