X Article Draft Uploader
mcncarl/yichen-skills
将 Obsidian 或本地 Markdown 文章上传到 X/Twitter Articles 草稿;支持 Markdown pipe 表格转成 X 原生表格块;如果文章最上方有图片,则按当前 X 界面提示的 5:2 封面图上传;如果没有封面图,则跳过封面区域,直接上传标题、正文、表格和正文图片,完成后提醒用户补一张 5:2 封面。X Article 当前实测正文最多 25…
知乎问答回答发布:在知乎问题下发布原创回答——搜热门问题、检查可答性、写内容、 Playwright 发布(绕 header 遮挡 + JS 遍历发布按钮)。当用户说"回答知乎问题""在知乎问答下回答" "发知乎回答""知乎答题""帮我回答这个知乎问题""批量回答知乎"时使用。与 skill-zhihu-publisher 区别:那个发专栏文章(zhuanlan),本 SKILL…
$ npx skills add ZJU-REAL/Easel --skill skill-zhihu-answer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ZJU-REAL/Easel skill-zhihu-answer --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/ZJU-REAL/Easel.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/openclaw/skill-zhihu-answer .claude/skills/skill-zhihu-answer && 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 "skill-zhihu-answer" agent skill from https://github.com/ZJU-REAL/Easel/tree/main/skills/openclaw/skill-zhihu-answer into .claude/skills/skill-zhihu-answer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-zhihu-answer", 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/ZJU-REAL/Easel/tree/main/skills/openclaw/skill-zhihu-answerType 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 ZJU-REAL/Easel --skill skill-zhihu-answer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ZJU-REAL/Easel skill-zhihu-answer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZJU-REAL/Easel.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/openclaw/skill-zhihu-answer .agents/skills/skill-zhihu-answer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "skill-zhihu-answer" agent skill from https://github.com/ZJU-REAL/Easel/tree/main/skills/openclaw/skill-zhihu-answer into .agents/skills/skill-zhihu-answer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-zhihu-answer", 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 ZJU-REAL/Easel --skill skill-zhihu-answer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ZJU-REAL/Easel skill-zhihu-answer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZJU-REAL/Easel.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/openclaw/skill-zhihu-answer .cursor/skills/skill-zhihu-answer && 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 "skill-zhihu-answer" agent skill from https://github.com/ZJU-REAL/Easel/tree/main/skills/openclaw/skill-zhihu-answer into .cursor/skills/skill-zhihu-answer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-zhihu-answer", 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/ZJU-REAL/Easel.git --path skills/openclaw/skill-zhihu-answer--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 ZJU-REAL/Easel --skill skill-zhihu-answer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ZJU-REAL/Easel skill-zhihu-answer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZJU-REAL/Easel.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/openclaw/skill-zhihu-answer .gemini/skills/skill-zhihu-answer && 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 "skill-zhihu-answer" agent skill from https://github.com/ZJU-REAL/Easel/tree/main/skills/openclaw/skill-zhihu-answer into .gemini/skills/skill-zhihu-answer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-zhihu-answer", 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 ZJU-REAL/Easel skill-zhihu-answerInstalls 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 ZJU-REAL/Easel --skill skill-zhihu-answer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ZJU-REAL/Easel.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/openclaw/skill-zhihu-answer .github/skills/skill-zhihu-answer && 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 "skill-zhihu-answer" agent skill from https://github.com/ZJU-REAL/Easel/tree/main/skills/openclaw/skill-zhihu-answer into .github/skills/skill-zhihu-answer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-zhihu-answer", 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 ZJU-REAL/Easel --skill skill-zhihu-answer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ZJU-REAL/Easel skill-zhihu-answer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZJU-REAL/Easel.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/openclaw/skill-zhihu-answer .opencode/skills/skill-zhihu-answer && 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 "skill-zhihu-answer" agent skill from https://github.com/ZJU-REAL/Easel/tree/main/skills/openclaw/skill-zhihu-answer into .opencode/skills/skill-zhihu-answer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-zhihu-answer", 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.
skill-zhihu-answer知乎问答回答发布:在知乎问题下发布原创回答——搜热门问题、检查可答性、写内容、 Playwright 发布(绕 header 遮挡 + JS 遍历发布按钮)。当用户说"回答知乎问题""在知乎问答下回答" "发知乎回答""知乎答题""帮我回答这个知乎问题""批量回答知乎"时使用。与 skill-zhihu-publisher 区别:那个发专栏文章(zhuanlan),本 SKILL…
Skill Zhihu Answer is an agent skill from ZJU-REAL/Easel. 知乎问答回答发布:在知乎问题下发布原创回答——搜热门问题、检查可答性、写内容、 Playwright 发布(绕 header 遮挡 + JS 遍历发布按钮)。当用户说"回答知乎问题""在知乎问答下回答" "发知乎回答""知乎答题""帮我回答这个知乎问题""批量回答知乎"时使用。与 skill-zhihu-publisher 区别:那个发专栏文章(zhuanlan),本 SKILL 专发问答区的回答;回答内容写作用制作层 SKILL (novel-writer / copywriting)。
Its SKILL.md is about 1.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `EASEL-META.md` and `references/commands.md`).
It sits in Writing & Content, covering Copywriting, Creative writing and fiction and Browser testing. It works with Playwright. The repository describes itself as: An open-source AI agent for social media — discover trends, create content, publish everywhere, and learn what works across Xiaohongshu, Douyin, Zhihu, Bilibili, and more.🎨一个开源的… The licence is Apache-2.0.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 278f420. 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:
pythonFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
zhihu.comFrom 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.
Skill Zhihu Answer loads about 1.2k tokens when it runs, and up to ~2k if it reads all its reference files. Until then it costs about 69 tokens; SKILL.md has 135 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 ZJU-REAL/Easel at commit 278f420, republished under its Apache-2.0 licence (© ZJU-REAL). 135 words, ~1,214 tokens.
.claude/skills/skill-zhihu-answer/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.在知乎问答帖子下发布原创回答:搜索热门问题 → 检查可答性 → 调用制作层 SKILL 写内容 → Playwright 发布。 核心脚本:
skills/shared/scripts/zhihu_answer.py(CWD=项目根)。命令速查见references/commands.md。
| SKILL | 定位 |
|---|---|
| skill-zhihu-answer(本 SKILL) | 知乎问答帖的回答发布:搜题 + 写内容 + 发布 |
| skill-zhihu-publisher | 知乎专栏文章(zhuanlan)发布,非问答回答 |
| skill-cross-platform-publish | 一稿多发,多平台分发 |
| novel-writer / copywriting | 制作层,生产回答正文;本 SKILL 调用它 |
1. 搜索热门问题(可选,或用户直接给 URL)
↓
2. 检查可答状态(未答过 + WriteAnswerButton 存在)
↓
3. 制作层写内容(用 novel-writer / copywriting SKILL,或用户自备文本)
↓
4. 发布前人设检查(有 Profile 时)
↓
5. zhihu_answer.py --exec 发布
↓
6. 发布后留痕(persona_gate record + publish-log record)用已登录的 ZhihuProfile 搜索问题,直接访问候选页取真实回答数(搜索结果元数据不准):
page.goto("https://www.zhihu.com/search?type=question&q=<关键词>", wait_until="networkidle")
# 直接访问候选问题页取真实数据
page.goto("<问题URL>", wait_until="domcontentloaded")
import re
m = re.search(r'(\d[\d,]*)\s*个回答', page.inner_text("body"))
ans_count = int(m.group(1).replace(',', '')) if m else 0
zhihu_answer.py目前不含搜索功能,搜索用临时脚本或用户直接给 URL(逻辑见references/commands.md§6)。
has_write = page.locator(".WriteAnswerButton").count() > 0
already_answered = page.evaluate("""
() => Array.from(document.querySelectorAll('button'))
.some(b => (b.innerText||'').trim() === '编辑回答')
""")
can_answer = has_write and not already_answered⚠️ 每个用户在同一问题只能回答一次。已答的问题显示「编辑回答」而非「写回答」。 对已答问题不要重复发布,否则进入编辑旧答案流程(发布按钮变为「提交修改」)。
回答正文属于制作层,用制作层 SKILL 写(novel-writer 或 copywriting),也可用用户提供的文本。
内容存为 outputs/主题名/answer_<问题ID>.md。
写作要点(恐怖/悬疑题材示例):第一人称、冷静克制、暗示>直白;短段落多换行适配手机; 开篇 500 字内建立世界观 + 第一个恐怖节点;文末加"本故事纯属虚构"。
cd <项目根> && python skills/shared/scripts/persona_gate.py check --score <评分>
# 始终退出码 0;低于 80 分时告知偏离点,但不阻断用户发布# Dry-run 预检(默认,不真正发布)
cd <项目根> && python skills/shared/scripts/zhihu_answer.py \
--question <问题URL> --content-file <回答内容.md>
# 正式发布
cd <项目根> && python skills/shared/scripts/zhihu_answer.py \
--question <问题URL> --content-file <回答内容.md> --exec
# 调试模式(有头浏览器,首次校验选择器时用)
cd <项目根> && python skills/shared/scripts/zhihu_answer.py \
--question <问题URL> --content-file <回答内容.md> --exec --headed根本原因:知乎顶部
<header class="AppHeader">覆盖「写回答」按钮,Playwright 常规.click()因 pointer event 被拦截而 30s 超时。必须绕过覆盖层。
策略1: btn.dispatch_event("click") ← 绕过 header,多数页面有效
策略2: React 完整事件序列(mousedown+mouseup+click,dispatchEvent bubbles)
策略3: btn.focus() + keyboard.press("Enter") ← 最可靠降级,焦点触发 React 事件每策略后检查 .public-DraftEditor-content 是否出现,出现即成功,否则进入下一策略。
根本原因:内容输入后按钮可能滚出视口,
wait_for(state="visible")超时;且同页有 「发布设置」与「发布回答」两个含「发布」的按钮,需精确匹配「发布回答」。
// JS 遍历全部 button,不依赖视口可见性
const pub = Array.from(document.querySelectorAll('button'))
.find(b => (b.innerText || '').trim().includes('发布回答'));
if (pub) { pub.scrollIntoView({block:'center'}); pub.dispatchEvent(new MouseEvent('click',{bubbles:true,cancelable:true,view:window})); }降级:locator("button:has-text('发布回答')").wait_for(state="attached") + scroll_into_view_if_needed() + dispatch_event("click")。
cd <项目根> && python skills/shared/scripts/persona_gate.py record \
--topic <主题> --profile <画像> --score <评分> --verdict <pass|warn>
cd <项目根> && python skills/openclaw/skill-publish-log/scripts/log.py record \
--platform 知乎 --title <问题标题> --profile <画像> \
--persona-score <评分> --persona-verdict <结论> --skill-source zhihu-answer| 问题 | 说明 |
|---|---|
| 同一问题只能回答一次 | 检查 can_answer 过滤,已答的跳过 |
| 知乎 Draft.js 编辑器 | 只支持纯文本段落,Markdown **加粗** 不渲染、会原样显示星号 |
| header 遮挡 | 已通过 dispatch_event 三策略绕过 |
| 发布按钮视口外 | 已通过 JS 遍历 + scrollIntoView 绕过 |
| 反爬风控 | 用 --disable-blink-features=AutomationControlled;发布间隔 ≥ 30s |
| 登录态 | 读 ~/.easel-browser-profiles/ZhihuProfile;未登录时输出 未登录知乎 并退出 |
python skills/shared/scripts/zhihu_answer.py --selftest # 脚本自测(不启浏览器)
python skills/shared/scripts/account_stats.py check # playwright 环境
python skills/shared/scripts/web_publisher.py whoami --platform zhihu # 知乎登录态© ZJU-REAL, 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
SKILL.md and 2 other files (references) in skills/openclaw/skill-zhihu-answer of ZJU-REAL/Easel.
Open the folder on GitHubat commit 278f420
Skill Zhihu Answer 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 |
|---|---|---|---|---|---|---|
| Skill Zhihu Answer this skillZJU-REAL/Easel | 3.4k | — | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| X Article Draft Uploadermcncarl/yichen-skills | 4.4k | — | ~2.9k | Automated safety check: Warn | Custom licence | |
| Creative Writingspytensor/openmozi | 456 | — | ~373 | Automated safety check: Pass | MIT | |
| Orwell Writingtamdogood/builder-essential-skills | 221 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Sn Ppt DoctorOpenSenseNova/SenseNova-Skills | 5.7k | — | ~884 | Automated safety check: Notes | MIT | |
| Page Prepadobe/skills | 197 | — | ~2.1k | Automated safety check: Pass | Apache-2.0 |
mcncarl/yichen-skills
将 Obsidian 或本地 Markdown 文章上传到 X/Twitter Articles 草稿;支持 Markdown pipe 表格转成 X 原生表格块;如果文章最上方有图片,则按当前 X 界面提示的 5:2 封面图上传;如果没有封面图,则跳过封面区域,直接上传标题、正文、表格和正文图片,完成后提醒用户补一张 5:2 封面。X Article 当前实测正文最多 25…
spytensor/openmozi
Creative content workflow: brief, research, outline, draft, refine.
tamdogood/builder-essential-skills
A skill your agent uses when an agent is asked to draft, rewrite, edit, review, polish, copyedit, simplify, humanize, or create written prose, including creative writing, essays, posts, scripts…
OpenSenseNova/SenseNova-Skills
A skill your agent uses when diagnosing PPT Skill setup or failures involving source parsing, Playwright or Chromium rendering, HTML-to-PPTX export, Workbench startup, or bundled search and…
adobe/skills
Prepare any webpage for clean interaction by detecting and removing disruptive overlays (cookie banners, GDPR consent, modals, popups, newsletter signups, paywalls, login walls).
EliasOulkadi/shokunin
Convert Kami HTML templates to production-grade PDF via Chromium/Playwright.
ZJU-REAL/Easel
微信公众号文章排版引擎:把 Markdown / Word(.docx) / PDF / 纯文本转成可直接粘贴进公众号编辑器的 HTML,自动章节编号、关键词标记、引言卡、目录、代码块、图片/GIF、作者签名;主题从 references/theme-index.md…
ZJU-REAL/Easel
微信公众号文章自动创作与发布工具。给定参考文章、文字或文档,自动搜索整理全网相关信息、生成图文并茂的公众号文章,并发布到微信公众号草稿箱。特别强调反 AI 检测写作。
ZJU-REAL/Easel
社媒卡片视觉设计系统:提供配色、中文字体层级、满画幅布局、品类骨架和死空白/密度质检,避免模板化 PPT 与廉价 AI 感。
ZJU-REAL/Easel
生成电商商品视觉方案:主图概念、场景图、详情页视觉方向和 AI 生图 Prompt. An agent skill from ZJU-REAL/Easel.
ZJU-REAL/Easel
将数据或文字内容转化为可视化信息图,支持静态(AntV)和动画 GIF 两种模式。当用户需要制作信息图、数据可视化、流程图、对比图、动画图表、GIF 图表、思维导图、SWOT 分析图时调用。本地渲染信息图/GIF 动画;要单张静态图片 URL 用 chart-visualization,要 CSV/JSON→整页报告用 data-report
ZJU-REAL/Easel
长篇小说/网文连载创作:从世界观、人设和三级大纲写到逐章正文,并用文件化状态维护伏笔、前情和跨章一致性. An agent skill from ZJU-REAL/Easel.
Works with
Categories
知乎问答回答发布:在知乎问题下发布原创回答——搜热门问题、检查可答性、写内容、 Playwright 发布(绕 header 遮挡 + JS 遍历发布按钮)。当用户说"回答知乎问题""在知乎问答下回答" "发知乎回答""知乎答题""帮我回答这个知乎问题""批量回答知乎"时使用。与 skill-zhihu-publisher 区别:那个发专栏文章(zhuanlan),本 SKILL…. Skill Zhihu Answer is an agent skill from ZJU-REAL/Easel.
Skill Zhihu Answer fits situations like: tasks that involve Copywriting; tasks that involve Creative writing and fiction; tasks that involve Browser testing.
Run `npx skills add ZJU-REAL/Easel --skill skill-zhihu-answer -a claude-code`. Or copy the skill folder (skills/openclaw/skill-zhihu-answer in ZJU-REAL/Easel) into .claude/skills/skill-zhihu-answer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ZJU-REAL/Easel --skill skill-zhihu-answer -a codex`. Or copy the skill folder (skills/openclaw/skill-zhihu-answer in ZJU-REAL/Easel) into .agents/skills/skill-zhihu-answer 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 ZJU-REAL/Easel --skill skill-zhihu-answer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/skill-zhihu-answer, .gemini/skills/skill-zhihu-answer, .github/skills/skill-zhihu-answer and .opencode/skills/skill-zhihu-answer in your project.
Going by SKILL.md and its folder, Skill Zhihu Answer needs the command-line tools its instructions call (python). Our summary lists: Python 3.
SKILL.md names 1 domain. In commands or code: zhihu.com; the agent is likely to contact it when it follows the instructions. 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.
Skill Zhihu Answer is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.2k tokens (SKILL.md is roughly 4.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 751 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Skill Zhihu Answer: X Article Draft Uploader (mcncarl/yichen-skills, 4.4k stars), Creative Writing (spytensor/openmozi, 456 stars), Orwell Writing (tamdogood/builder-essential-skills, 221 stars) and Sn Ppt Doctor (OpenSenseNova/SenseNova-Skills, 5.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ZJU-REAL (a GitHub organization) maintains it in ZJU-REAL/Easel, which has 3,376 GitHub stars. The repository holds 114 skills in this directory. The repository was last updated on October 9, 2026.
Source: ZJU-REAL/Easel on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.