Tool Creator
hAcKlyc/MyAgents
把用户的可复用需求封装成标准化的 Agent-CLI 工具,并用 myagents tool add 注册进 MyAgents 工具注册表——注册后所有未来会话(builtin / DSH / Claude Code / Codex 全 runtime)的 AI 都会在 system prompt 里自动发现它。触发场景:(1) 用户说「把 XX…
Improve a prompt with the Opik Agent Optimizer — resolve the prompt, a dataset, and a metric, pick the algorithm, run a bounded optimization, check the gain on held-out data, and save the winner as…
$ npx skills add comet-ml/opik-mcp --skill opik-optimize -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install comet-ml/opik-mcp opik-optimize --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/comet-ml/opik-mcp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/src/opik_mcp/skills/opik-optimize .claude/skills/opik-optimize && 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 "opik-optimize" agent skill from https://github.com/comet-ml/opik-mcp/tree/main/src/opik_mcp/skills/opik-optimize into .claude/skills/opik-optimize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opik-optimize", 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/comet-ml/opik-mcp/tree/main/src/opik_mcp/skills/opik-optimizeType 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 comet-ml/opik-mcp --skill opik-optimize -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install comet-ml/opik-mcp opik-optimize --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/comet-ml/opik-mcp.git skills-src && mkdir -p .agents/skills && cp -r skills-src/src/opik_mcp/skills/opik-optimize .agents/skills/opik-optimize && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "opik-optimize" agent skill from https://github.com/comet-ml/opik-mcp/tree/main/src/opik_mcp/skills/opik-optimize into .agents/skills/opik-optimize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opik-optimize", 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 comet-ml/opik-mcp --skill opik-optimize -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install comet-ml/opik-mcp opik-optimize --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/comet-ml/opik-mcp.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/src/opik_mcp/skills/opik-optimize .cursor/skills/opik-optimize && 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 "opik-optimize" agent skill from https://github.com/comet-ml/opik-mcp/tree/main/src/opik_mcp/skills/opik-optimize into .cursor/skills/opik-optimize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opik-optimize", 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/comet-ml/opik-mcp.git --path src/opik_mcp/skills/opik-optimize--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 comet-ml/opik-mcp --skill opik-optimize -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install comet-ml/opik-mcp opik-optimize --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/comet-ml/opik-mcp.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/src/opik_mcp/skills/opik-optimize .gemini/skills/opik-optimize && 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 "opik-optimize" agent skill from https://github.com/comet-ml/opik-mcp/tree/main/src/opik_mcp/skills/opik-optimize into .gemini/skills/opik-optimize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opik-optimize", 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 comet-ml/opik-mcp opik-optimizeInstalls 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 comet-ml/opik-mcp --skill opik-optimize -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/comet-ml/opik-mcp.git skills-src && mkdir -p .github/skills && cp -r skills-src/src/opik_mcp/skills/opik-optimize .github/skills/opik-optimize && 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 "opik-optimize" agent skill from https://github.com/comet-ml/opik-mcp/tree/main/src/opik_mcp/skills/opik-optimize into .github/skills/opik-optimize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opik-optimize", 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 comet-ml/opik-mcp --skill opik-optimize -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install comet-ml/opik-mcp opik-optimize --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/comet-ml/opik-mcp.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/src/opik_mcp/skills/opik-optimize .opencode/skills/opik-optimize && 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 "opik-optimize" agent skill from https://github.com/comet-ml/opik-mcp/tree/main/src/opik_mcp/skills/opik-optimize into .opencode/skills/opik-optimize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opik-optimize", 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.
opik-optimizeImprove a prompt with the Opik Agent Optimizer — resolve the prompt, a dataset, and a metric, pick the algorithm, run a bounded optimization, check the gain on held-out data, and save the winner as…
Opik Optimize is an agent skill from comet-ml/opik-mcp. Improve a prompt with the Opik Agent Optimizer — resolve the prompt, a dataset, and a metric, pick the algorithm, run a bounded optimization, check the gain on held-out data, and save the winner as a new prompt version with the optimization run link. Runs via the opik-optimizer package; reads prompts and datasets via the MCP when connected. Use for "optimize this prompt", "improve my system prompt", "make the agent answer better", "tune the prompt against my dataset", "run the prompt optimizer". Not for measuring…
Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 15 other files, including reference files (for example `evals/HARNESS.md`, `evals/cases.yaml` and `evals/fixtures/format/seed.py`). Compatibility notes: Tested with Claude Code; works with any Agent Skills-compatible host (Cursor, VS Code Copilot, Codex). Requires a Python project with Opik configured, a…
It sits in AI & LLM Engineering, covering Prompt engineering and MCP servers. It works with Model Context Protocol. The repository describes itself as: Model Context Protocol (MCP) server for Opik, the open-source LLM observability and evaluation platform, built by Comet. Read traces, log scores, and manage prompts from Claude… The licence is Apache-2.0.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit f1dd464. 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:
ReadGrepGlobBashWriteFrom allowed-tools in the SKILL.md frontmatter.
Ships script files (Python), which the agent can run.
Shell commands in SKILL.md call:
uvpipFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
comet.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
OPENAI_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Tested with Claude Code; works with any Agent Skills-compatible host (Cursor, VS Code Copilot, Codex). Requires a Python project with Opik configured, a provider API key, and a dataset (or traces to build one). Install the `opik` skill alongside this one — it holds the shared dataset and prompt-library references; without it, this skill falls back to the public docs.
From compatibility in the SKILL.md frontmatter.
Opik Optimize loads about 2.6k tokens when it runs, and up to ~3.4k if it reads all its reference files. Until then it costs about 160 tokens; SKILL.md has 1,225 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 noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Grep, Glob, Bash, WriteAutomated 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 comet-ml/opik-mcp at commit f1dd464, republished under its Apache-2.0 licence (© comet-ml). 1,225 words, ~2,602 tokens.
.claude/skills/opik-optimize/SKILL.md (or your agent's skills folder). This skill also uses 11 other files; get the full folder from GitHub.Definition of done: an optimized prompt whose score on the metric beats the baseline on data it was not tuned on, the optimization run link in Opik, the cost of getting there, and the winner saved as a new prompt version (when the prompt lives in the library) — with the swap into code left as the next step. If the optimization can't run within a stated budget, stop at the first genuine blocker and return exactly one next step. A prompt that scores higher only on its own training items is not an improvement.
Operate: measure the baseline first, state the budget before spending it, hold data out, pick the algorithm for the failure you see, save the winner where it can be versioned — and change no application code. The only file this skill writes is a runner outside the repo; the prompt is saved to Opik, not into the codebase.
The entry point is /opik-optimize <prompt-name> (a prompt-library prompt), /opik-optimize <path or function> (a prompt in code), or /opik-optimize (find the system prompt in this repo). Infer the rest; treat these as optional overrides:
expected_output if present, else one binary judge) · algorithm (default: MetaPromptOptimizer) · budget (default: n_samples=50, max_trials=10) · model · validation split (default: hold out 20%).Ask only at a genuine, non-inferable blocker (see Blockers).
client.get_chat_prompt(name) (or get_prompt for a text prompt). Note the current version — that is the baseline.messages=[...]; read it verbatim. Note where it lives; you will not edit it.llm span's input.messages on a representative trace.The optimizer's opik_optimizer.ChatPrompt is a different class from the library's opik.ChatPrompt — build it from the raw messages yourself: references/sdk-snippets.md (Resolve the prompt).
The optimizer needs an opik.Dataset whose item keys match the prompt's {variables}: references/sdk-snippets.md (Resolve the dataset).
suite.get_items() → client.get_or_create_dataset("<suite>-optimize", project_name=…) → insert([{**it["data"]} …]).search_traces → {"question": t.input[...], "expected_output": …}) or run /opik-evaluate first.validation_dataset=. Note what it does: the optimizer scores every trial on validation_dataset and uses the train set to show the reasoning model examples — so the validation set is the selection set, and it needs ≥10 items or every candidate ties (a 4-item split logs n_samples … larger than evaluation dataset size and cannot separate prompts). If you need a gain measured on items the optimizer never saw, keep a third split and re-score the winner on it with evaluate(). Fewer than ~20 items in total → say the result will be noisy; below 10 → Blocker.A function (dataset_item, llm_output) -> float, higher is better. Give it a real name (def refund_answer_similarity(...)) — its __name__ becomes the Optimization run's objective name in the UI and result.metric_name; a function called metric shows up as "metric".
expected_output present → heuristic (LevenshteinRatio, Equals, or a task-specific check) — deterministic and free. Prefer a graded metric over exact match: when the baseline scores 0.0 on every item (observed with Equals on a strict output format), every candidate also scores 0.0 and the optimizer has nothing to climb — five trials of flat zeros is a metric problem, not a prompt problem.../opik-evaluate/references/write-judge-prompt.md), wrapped to return its score .value. Multi-objective → MultiMetricObjective.
Never optimize against a judge nobody validated: an unvalidated judge is the easiest thing to overfit.| Failure you see | Optimizer |
|---|---|
| Instructions unclear / underspecified (general default) | MetaPromptOptimizer |
| The model needs examples of the right answer; few-shot is acceptable | FewShotBayesianOptimizer |
| Failures cluster into a few root causes | HierarchicalReflectiveOptimizer (HRPO) |
| Larger budget, want broad search | EvolutionaryOptimizer or GepaOptimizer |
| The prompt is fine, temperature/top_p are not | ParameterOptimizer.optimize_parameter(...) |
| Tool descriptions are the problem | optimize_prompt(..., optimize_tools=True) (optimize_mcp is deprecated) |
uv add opik-optimizer (or pip install opik-optimizer) in a scratch environment, not the repo's lockfile unless the user wants it. Each trial evaluates n_samples items with the task model plus the reasoning model — tell the user the rough call count before running. Provider key absent → Blocker.
The MetaPromptOptimizer run, with the default budget: references/sdk-snippets.md (Run the optimizer).
Write the runner as a temp file outside the repo. The run appears in Opik as an Optimization (result.get_run_link()).
result.initial_score → result.score on the metric; result.details["stop_reason"] and ["trials_completed"]; result.llm_calls, result.llm_cost_total (may be None when the provider returns no cost — say "cost unavailable", don't invent one). Report the validation score, not the training score. A gain within run-to-run noise (rerun the baseline once if in doubt) is "no measurable improvement" — say so rather than shipping a lateral move, and do not save a new version for it. The common cause of a flat result: the answers depend on context the prompt can't contain (retrieval, tools, account data) — then the prompt isn't the bottleneck and the next step is /opik-explain on the worst items, not more trials.
For a library prompt, save the winner as a new version: references/sdk-snippets.md (Save the winner).
For a prompt that lives in code, do not edit the file — return the optimized text and the diff as the next step. Then one next step (see Output): typically "/opik-compare the new version against the regression suite" or "point the app at version vN".
Stop at the earliest blocker and return exactly one next step:
opik configure, then rerun /opik-optimize."/opik-evaluate to build one, or name an existing dataset."OPENAI_API_KEY (or the relevant key) and rerun."synthetic) and rerun."User-facing: a short human message — baseline vs optimized score on validation, the run link, the cost, the algorithm, what changed in the prompt (one or two lines), the new version (or the diff for a code prompt), and the single next step. Not the full trial history.
Underneath (for composition / evals), one shape, with its invariants: references/output-shape.md.
Worked runs (library prompt with a heuristic metric, no real gain, prompt in code, blocked): references/examples.md.
Reporting the training-set score as the gain; optimizing against an unvalidated judge; spending an unbounded budget (no n_samples/max_trials) or not stating it; overwriting the prompt in place instead of a new version; editing the prompt in the codebase; treating opik.ChatPrompt and opik_optimizer.ChatPrompt as interchangeable; optimizing on fewer than ~20 items and calling it a result; choosing the algorithm by novelty rather than by the failure observed; using deprecated optimize_mcp.
Dataset and prompt-library detail live in the opik skill, installed beside this one — paths relative to this file: ../opik/references/evaluation-datasets.md (datasets, insert, versions, metrics), ../opik/references/best-practices.md (prompt library, versioning), ../opik/references/tracing-python.md (SDK client). Judge design and validation: ../opik-evaluate/references/write-judge-prompt.md, ../opik-evaluate/references/validate-evaluator.md. If your host lays skills out differently, locate the opik skill's references/ directory.
Optimizer API (opik-optimizer): https://www.comet.com/docs/opik/agent_optimization/overview. If the opik skill isn't installed, say so in the report and use https://www.comet.com/docs/opik/ rather than working from memory.
© comet-ml, 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 11 other files (references) in src/opik_mcp/skills/opik-optimize of comet-ml/opik-mcp.
Open the folder on GitHubat commit f1dd464
Opik Optimize 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 |
|---|---|---|---|---|---|---|
| Opik Optimize this skillcomet-ml/opik-mcp | 219 | — | ~2.6k | Automated safety check: Notes | Apache-2.0 | |
| Tool CreatorhAcKlyc/MyAgents | 915 | — | ~1.5k | Automated safety check: Pass | AGPL-3.0 | |
| NaturalNPC-Worldwide/npcpy | 1.5k | — | ~161 | Automated safety check: Pass | MIT | |
| Pi AgentK-Dense-AI/scientific-agent-skills | 48k | 1 repos | ~2.1k | Automated safety check: Pass | MIT | |
| Workflow Schema Tuningbreaking-brake/cc-wf-studio | 5.4k | — | ~1.3k | Automated safety check: Pass | Custom licence | |
| Hcls Build Agentaws-samples/amazon-bedrock-agents-healthcare-lifesciences | 274 | — | ~885 | Automated safety check: Pass | MIT-0 |
hAcKlyc/MyAgents
把用户的可复用需求封装成标准化的 Agent-CLI 工具,并用 myagents tool add 注册进 MyAgents 工具注册表——注册后所有未来会话(builtin / DSH / Claude Code / Codex 全 runtime)的 AI 都会在 system prompt 里自动发现它。触发场景:(1) 用户说「把 XX…
NPC-Worldwide/npcpy
Render the provided prompt template with Jinja context and send it to the active NPC's LLM.
K-Dense-AI/scientific-agent-skills
Builds with and operates Pi, the minimal terminal coding harness.
breaking-brake/cc-wf-studio
Guides edits to cc-wf-studio's workflow schema so AI agents generate better workflows, treating schema text as prompt engineering rather than validation.
aws-samples/amazon-bedrock-agents-healthcare-lifesciences
A skill your agent uses when a developer wants to build a new healthcare or life sciences agent, structure tools and system prompts for an HCLS workflow, or create a Strands agent with…
cyanheads/pubmed-mcp-server
Scaffold a new MCP prompt template. An agent skill from cyanheads/pubmed-mcp-server.
comet-ml/opik-mcp
Reference for the Opik SDK — tracing, span types, framework integrations, threads, and the prompt library (Python, TypeScript, REST).
comet-ml/opik-mcp
Run a candidate against the baseline over an Opik test suite and read the numbers back — which cases broke, which got fixed, the per-metric deltas, worst rows, and whether the two runs are…
comet-ml/opik-mcp
Surface the Opik traces worth a developer's attention, ranked by signal — Diagnostics issues first, then errors, failed tool calls, latency, regressions, and low online-eval scores.
comet-ml/opik-mcp
Build an LLM evaluation and run it against the app, returning an Opik experiment with scores and its link.
comet-ml/opik-mcp
Add Opik tracing to an existing app and verify a real trace lands.
comet-ml/opik-mcp
Decide ship or hold for a candidate from the compare skill's numbers, against an explicit release policy — regressions, pass rate, safety-tagged cases, subgroup consistency, latency and cost…
Works with
Categories
Improve a prompt with the Opik Agent Optimizer — resolve the prompt, a dataset, and a metric, pick the algorithm, run a bounded optimization, check the gain on held-out data, and save the winner as…. Opik Optimize is an agent skill from comet-ml/opik-mcp. Improve a prompt with the Opik Agent Optimizer — resolve the prompt, a dataset, and a metric, pick the algorithm, run a bounded optimization, check the gain on held-out data, and save the winner as a new prompt version with the optimization run link.
Opik Optimize fits situations like: optimize this prompt; improve my system prompt; make the agent answer better; tune the prompt against my dataset.
Run `npx skills add comet-ml/opik-mcp --skill opik-optimize -a claude-code`. Or copy the skill folder (src/opik_mcp/skills/opik-optimize in comet-ml/opik-mcp) into .claude/skills/opik-optimize in your project. Claude Code loads it when a task matches its description.
Run `npx skills add comet-ml/opik-mcp --skill opik-optimize -a codex`. Or copy the skill folder (src/opik_mcp/skills/opik-optimize in comet-ml/opik-mcp) into .agents/skills/opik-optimize 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 comet-ml/opik-mcp --skill opik-optimize -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/opik-optimize, .gemini/skills/opik-optimize, .github/skills/opik-optimize and .opencode/skills/opik-optimize in your project.
Going by SKILL.md and its folder, Opik Optimize needs Python for the scripts in its folder, the command-line tools its instructions call (uv and pip) and credentials named OPENAI_API_KEY. Our summary lists: Python 3; A credential in OPENAI_API_KEY. Its frontmatter pre-approves these tools: Read, Grep, Glob, Bash, Write. Compatibility (from SKILL.md): Tested with Claude Code; works with any Agent Skills-compatible host (Cursor, VS Code Copilot, Codex). Requires a Python project with Opik configured, a provider API key, and a dataset (or traces to build one). Install the `opik` skill alongside this one — it holds the shared dataset and prompt-library references; without it, this skill falls back to the public docs..
SKILL.md names 1 domain. As links in the text: comet.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Opik Optimize 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 2.6k tokens (SKILL.md is roughly 10k 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 768 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Opik Optimize: Tool Creator (hAcKlyc/MyAgents, 915 stars), Natural (NPC-Worldwide/npcpy, 1.5k stars), Pi Agent (K-Dense-AI/scientific-agent-skills, 48k stars) and Workflow Schema Tuning (breaking-brake/cc-wf-studio, 5.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
comet-ml (a GitHub organization) maintains it in comet-ml/opik-mcp, which has 219 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 6, 2026.
Source: comet-ml/opik-mcp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.