Loop Change Verifier
cobusgreyling/loop-engineering
Acts as a skeptical checker for changes an implementer sub-agent made, running the tests, confirming the diff scope and returning approve, reject or escalate to a human.
Has a fresh-context adversary attack a blog post, recommendation, analysis brief or piece of code before you ship it, using a profile suited to that kind of artifact.
$ npx skills add oaustegard/claude-skills --skill challenging -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install oaustegard/claude-skills challenging --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/oaustegard/claude-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/challenging .claude/skills/challenging && 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 "challenging" agent skill from https://github.com/oaustegard/claude-skills/tree/main/challenging into .claude/skills/challenging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "challenging", 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/oaustegard/claude-skills/tree/main/challengingType 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 oaustegard/claude-skills --skill challenging -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install oaustegard/claude-skills challenging --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/oaustegard/claude-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/challenging .agents/skills/challenging && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "challenging" agent skill from https://github.com/oaustegard/claude-skills/tree/main/challenging into .agents/skills/challenging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "challenging", 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 oaustegard/claude-skills --skill challenging -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install oaustegard/claude-skills challenging --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/oaustegard/claude-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/challenging .cursor/skills/challenging && 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 "challenging" agent skill from https://github.com/oaustegard/claude-skills/tree/main/challenging into .cursor/skills/challenging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "challenging", 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/oaustegard/claude-skills.git --path challenging--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 oaustegard/claude-skills --skill challenging -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install oaustegard/claude-skills challenging --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/oaustegard/claude-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/challenging .gemini/skills/challenging && 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 "challenging" agent skill from https://github.com/oaustegard/claude-skills/tree/main/challenging into .gemini/skills/challenging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "challenging", 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 oaustegard/claude-skills challengingInstalls 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 oaustegard/claude-skills --skill challenging -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/oaustegard/claude-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/challenging .github/skills/challenging && 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 "challenging" agent skill from https://github.com/oaustegard/claude-skills/tree/main/challenging into .github/skills/challenging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "challenging", 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 oaustegard/claude-skills --skill challenging -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install oaustegard/claude-skills challenging --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/oaustegard/claude-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/challenging .opencode/skills/challenging && 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 "challenging" agent skill from https://github.com/oaustegard/claude-skills/tree/main/challenging into .opencode/skills/challenging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "challenging", 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.
challengingHas a fresh-context adversary attack a blog post, recommendation, analysis brief or piece of code before you ship it, using a profile suited to that kind of artifact.
This skill sets up an adversarial pass over a finished deliverable. It offers three routes: a subagent in Claude Code that starts with a fresh context and needs no API key, an external route that calls Gemini or the Anthropic API from environments such as claude.ai or Codex, and a self route where the same assistant plays the adversary in a separate reply. With automatic selection it tries Gemini, then Claude, then the self route, depending on which credentials exist.
You pick a profile for the artifact: prose, prose-register (for checking fidelity to a named voice), analysis, code, recommendation, or philosophers (for arguments and design rationales). Each profile file bundles a persona, an anti-rationalization table, evaluation criteria and the adversary prompt, and the agent reads only the one it needs. A Python script, scripts/challenger.py, backs the helpers, and a drill reference applies a 5 Whys pattern. The excerpt is cut off partway through the profile table.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit cf49d47. 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.
Ships 1 file in scripts/ (Python), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
timkellogg.meFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
CF_API_TOKENGOOGLE_API_KEYANTHROPIC_API_KEYAPI_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Adversarial Review Before Shipping loads about 3.4k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 78 tokens; SKILL.md has 1,270 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); the scripts in this folder are not scanned.
The full file from oaustegard/claude-skills at commit cf49d47, republished under its MIT licence (© oaustegard). 1,270 words, ~3,399 tokens.
.claude/skills/challenging/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.Adversarial review before shipping. Three paths, each with distinct trade-offs:
The adversary='auto' resolution (default) picks gemini → claude → self based on available credentials. Callers in Claude Code still use prepare() + Task tool explicitly (subagent is strictly better than self in that environment, and auto-detection of Claude Code is brittle).
Inspired by VDD (dollspace.gay) and Grainulation's anti-rationalization patterns. The drill helper adopts the 5 Whys pattern from Tim Kellogg's open-strix writeup. The self-path persona-inhabitation move is kin to generative-thinking's inversion — commit to the mode before evaluating.
Pick the profile matching your artifact. Read only the profile you need — each is self-contained with persona, anti-rationalization table, evaluation criteria, and adversary system prompt.
| Profile | Use For | Iteration strategy | File |
|---|---|---|---|
prose | Blog posts, essays, articles — generic prose competence | parallel replay | references/prose.md |
prose-register | Prose with a named voice signature — fidelity check | parallel replay | references/prose-register.md |
analysis | Research briefs, comparisons, synthesis | parallel replay | references/analysis.md |
code | Scripts, implementations, PRs | parallel replay | references/code.md |
recommendation | Technical decisions, architecture choices | parallel replay | references/recommendation.md |
philosophers | Arguments, position pieces, design rationales — conceptual-layer audit | parallel replay | references/philosophers.md |
drill | 5 Whys on one finding from a review | sequential deepen | references/drill.md |
One engine, one surface, two iteration strategies. Review profiles iterate in parallel replay — each pass independent, novelty tracked for confabulation. Drill iterates in sequential deepen — each pass takes the chain so far and produces one more why-level until bedrock or max depth, followed by a synthesis pass that extracts root causes.
philosophers and analysis are complements on argument-heavy artifacts: analysis audits the evidentiary layer (source independence, cherry-picking, calibration); philosophers audits the conceptual layer via Socratic elenchus and Aristotelian division (definitional stability, inference validity, is/ought slippage, taxonomy-before-verdict). An artifact can pass one and fail the other.
prose and prose-register are siblings, not redundant. prose evaluates generic prose competence (claims, logic, structure, performed insight) and is explicitly told not to comment on style. prose-register evaluates fidelity to a named voice signature passed via voice=... (positive markers + anti-patterns) and ignores generic competence. Run both passes on voiced prose — they catch different failure modes.
Two-step protocol: a Python helper builds the prompt, you spawn a subagent via the Task tool, then a parser turns its response into structured findings.
import sys
sys.path.insert(0, '/mnt/skills/user/challenging/scripts')
from challenger import prepare, parse_response
job = prepare(
artifact=open('/home/claude/draft.md').read(),
profile='prose',
context='Blog post about RAG scaling laws',
)Then invoke the Task tool — subagent_type='general-purpose', prompt=job['prompt'], description='Adversarial review (prose)'. The subagent runs in a fresh context, applies the persona, and returns a JSON message. Pass that message text to the parser:
result = parse_response(subagent_text)
print(result['verdict']) # SHIP | REVISE | RETHINK
print(result['findings']) # List of specific issues
print(result['strengths']) # What to preserveWhy subagents (not the API): no key, no network dependency, fresh context, and the same Claude that's reviewing your work is reviewing it again with no prior bias — but in a clean window. For cross-model diversity (genuinely different blind spots), use Gemini below.
prose-register (subagent path)For prose written in a named voice, prose will miss register-specific failure modes by design (its persona is instructed not to comment on style). Use the prose-register profile with a voice=... signature instead — or in addition, since the two profiles target orthogonal failure modes.
voice = """
Corvid voice signature.
Positive markers: short sentences when certainty is high, dry observations,
lead with the answer then context, no throat-clearing.
Anti-patterns: heroic-narrator framing, drama-line-breaks ("Then the part that
almost killed it." floating alone), cliche tells ("shot itself in the foot",
"footgun"), time-scale inflation ("a month ago" when it was yesterday),
performed-significance setups ("What's interesting about this is..."),
RTFM-performed-as-revelation, precious sentimentality in closings.
"""
job = prepare(
artifact=open('/home/claude/draft.md').read(),
profile='prose-register',
context='Blog post for muninn.austegard.com',
voice=voice,
)
# Task tool → parse_response() as usual.voice is required for prose-register and rejected for every other profile — pass the signature once, fail loud if it leaks to the wrong call. The richer the signature (with both positive markers and explicit anti-patterns), the more precise the review. A thin signature returns verdict: RETHINK with a finding describing what to sharpen rather than a confident review against an ambiguous spec.
Drill uses the same prepare() / Task / parse_response() protocol as review profiles, but you run the loop yourself — each pass takes the chain so far and produces exactly ONE new {why, because}. When the adversary sets bedrock=true (or you hit max depth), run a final synthesis pass.
from challenger import prepare, parse_response
suspect = next(f for f in result['findings'] if f['severity'] in ('high', 'critical'))
artifact = open('/home/claude/draft.md').read()
ctx = 'Blog post about RAG scaling laws'
chain = []
for depth in range(1, 6):
job = prepare(artifact, 'drill', context=ctx, finding=suspect, chain=chain)
# Task tool: subagent_type='general-purpose', prompt=job['prompt']
step = parse_response(subagent_text) # {why, because, bedrock, reasoning}
chain.append({'why': step['why'], 'because': step['because']})
if step.get('bedrock'):
break
# Final synthesis pass over the completed chain
job = prepare(artifact, 'drill', context=ctx, finding=suspect, chain=chain, synthesize=True)
# Task tool again, then:
diagnosis = parse_response(subagent_text)
print(diagnosis['chain']) # [{why, because}, ...]
print(diagnosis['root_causes']) # usually 3-4 distinct systemic issues
print(diagnosis['direction']) # compass heading for the process fixfinding accepts either a dict from parse_response() or a free-text description. Patches fix the instance; drills fix the class. Why sequential, not parallel? A single-shot drill lets the model shortcut the whole tree and produces renames instead of explanations; one level per pass forces each "because" to earn its depth. See references/drill.md for when to drill and the anti-patterns to reject.
Where subagents aren't available, call an external model directly.
from challenger import challenge
result = challenge(
artifact=open('draft.md').read(),
profile='prose',
context='Blog post about RAG scaling laws',
adversary='gemini', # default — cross-model diversity
)adversary accepts:
auto (default) — resolves to gemini > claude > self based on available credentials. Logs the choice.gemini — Gemini 3.8 Flash at thinking_level='high'. Cross-model + cross-context. Requires Gemini credentials. (Was 3.1 Pro until 2026-09-03; the Pro tier is off routing, its price/quality is dominated by the later Flash models.)claude — Anthropic API. Cross-context, same model family. Do not use this in Claude Code — use the subagent path instead.self — NOT runnable via challenge() (raises with a pointer to prepare_self()). Self-challenge requires the caller assistant to produce the adversary response, which a synchronous function cannot do.Drill uses the same challenge() call with profile='drill'. challenge() runs the whole sequential-deepen loop internally and returns the synthesized diagnosis:
diagnosis = challenge(
artifact,
profile='drill',
context=ctx,
finding=suspect, # required for drill
max_iterations=5, # optional — defaults to 5 for drill, 3 for review
)
print(diagnosis['chain'], diagnosis['root_causes'], diagnosis['direction'])result = challenge(artifact, profile='analysis', mode='blocking', max_iterations=3)Loops the adversary until: (a) no actionable findings, (b) novelty rate > 75% (adversary inventing problems — artifact is clean), or (c) max iterations. mode is ignored when profile='drill' — drill always iterates until bedrock or max depth. Subagent-path callers can replicate blocking mode by looping prepare() / Task / parse_response() themselves and tracking findings across iterations.
When neither subagents nor external API credentials are available — or when subject-matter context from the current conversation is load-bearing for the review — use prepare_self(). The caller assistant inhabits the adversary persona in a dedicated response.
from challenger import prepare_self, parse_response
job = prepare_self(
artifact=open('draft.md').read(),
profile='analysis',
context='Cross-domain claim that depends on codebase-specific IEEE-754 conventions',
)
# job is {'system': <adversary system prompt>, 'user': <artifact + context>, ...}The caller then:
job['system'] — the prompt opens with SELF-INVOCATION MODE instructing a full persona switch. Commit to it.parse_response().# After generating the adversary JSON in a dedicated response:
result = parse_response(adversary_json_text)
print(result['verdict'], result['findings'])When self beats external: the artifact depends on conventions visible only from inside the conversation (codebase invariants, prior decisions, domain terminology established earlier). External adversaries with generic priors issue confident-but-wrong findings in these cases; self retains the context.
When external beats self: the artifact contains confabulations or blind spots the caller already committed to. Fresh context catches these; self inherits them.
When possible, run both. They have orthogonal failure modes.
Drill via self path uses the same loop as the subagent drill: iterate prepare_self(profile='drill', finding=..., chain=...) — produce one {why, because} per dedicated response — append to chain — until bedrock or max depth — then a final synthesize pass.
context to ground the adversary on APIs/patterns it may not know.The subagent path needs no credentials. The API path loads from environment or project files:
CF_ACCOUNT_ID, CF_GATEWAY_ID, CF_API_TOKEN from env or proxy.envGOOGLE_API_KEY from envANTHROPIC_API_KEY or API_KEY from env or claude.envNo external skill dependencies. requests is loaded lazily — only the API path requires it.
© oaustegard, MIT. 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 10 other files (scripts, references) in challenging of oaustegard/claude-skills.
Open the folder on GitHubat commit cf49d47
Adversarial Review Before Shipping 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 |
|---|---|---|---|---|---|---|
| Adversarial Review Before Shipping this skilloaustegard/claude-skills | 150 | — | ~3.4k | Automated safety check: Pass | MIT | |
| Loop Change Verifiercobusgreyling/loop-engineering | 11k | 1 repos | ~383 | Automated safety check: Pass | MIT | |
| O2 Review Loopopenobserve/openobserve | 22k | — | ~3.7k | Automated safety check: Pass | AGPL-3.0 | |
| Clawteamwin4r/ClawTeam-OpenClaw | 1.5k | — | ~3.1k | Automated safety check: Pass | MIT | |
| OMA Multi-Agent Orchestrationfirst-fluke/oh-my-agent | 1.3k | — | ~4.1k | Automated safety check: Pass | MIT | |
| UltracodePabloNAX/ultracode-skill | 187 | — | ~3.7k | Automated safety check: Pass | MIT |
cobusgreyling/loop-engineering
Acts as a skeptical checker for changes an implementer sub-agent made, running the tests, confirming the diff scope and returning approve, reject or escalate to a human.
openobserve/openobserve
Splits a change into planner, coder and independent reviewer roles: you confirm a spec, a subagent implements it, and a separate reviewer checks each round's local WIP commit.
win4r/ClawTeam-OpenClaw
Multi-agent swarm orchestration. An agent skill from win4r/ClawTeam-OpenClaw.
first-fluke/oh-my-agent
Decomposes a complex feature into tasks, dispatches parallel specialist agents with durable state, and supervises verification, QA review and retries.
PabloNAX/ultracode-skill
Run a lightweight Ultracode workflow for serious coding tasks: plan, split, delegate when useful and allowed by the host, integrate, and verify.
cursor/plugins
Adds a second, stronger model that the main agent consults before major decisions, when stuck and before finishing, controlled by /advisor commands.
oaustegard/claude-skills
Builds interactive Vega-Lite charts from uploaded data: analyzes the fields, picks five to ten fitting chart types, and produces a React artifact with the data embedded inline.
oaustegard/claude-skills
Builds self-contained single-file HTML pages such as reports, decks, postmortems, flowcharts and prototypes from a small spec using a bundled Python composer and templates.
oaustegard/claude-skills
Rewrites model-sounding prose into plain technical writing and checks that every claim survives, for PR text, docs, commit messages and similar drafts.
oaustegard/claude-skills
Guides building standards-based Preact apps with native-first choices, HTM syntax, import maps and vendored ESM, from single-file demos to larger builds.
oaustegard/claude-skills
Deprecated sampler that captures short windows of the Bluesky firehose, clusters trending terms and builds an HTML report; replaced by the browsing-bluesky skill.
oaustegard/claude-skills
Control Spotify playback and manage playlists via MCP server.
Works with
Categories
Has a fresh-context adversary attack a blog post, recommendation, analysis brief or piece of code before you ship it, using a profile suited to that kind of artifact. This skill sets up an adversarial pass over a finished deliverable.ai or Codex, and a self route where the same assistant plays the adversary in a separate reply.
Adversarial Review Before Shipping fits situations like: stress-testing a blog post or essay for weak claims before publishing; getting an outside challenge to a technical recommendation or architecture choice; reviewing a script or pull request with a fresh-context reviewer before merging; checking that a draft keeps a specific writing voice.
Run `npx skills add oaustegard/claude-skills --skill challenging -a claude-code`. Or copy the skill folder (challenging in oaustegard/claude-skills) into .claude/skills/challenging in your project. Claude Code loads it when a task matches its description.
Run `npx skills add oaustegard/claude-skills --skill challenging -a codex`. Or copy the skill folder (challenging in oaustegard/claude-skills) into .agents/skills/challenging 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 oaustegard/claude-skills --skill challenging -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/challenging, .gemini/skills/challenging, .github/skills/challenging and .opencode/skills/challenging in your project.
Going by SKILL.md and its folder, Adversarial Review Before Shipping needs Python for the scripts in its folder and credentials named CF_API_TOKEN, GOOGLE_API_KEY, ANTHROPIC_API_KEY and API_KEY. Our summary lists: A Gemini or Anthropic API key for the external route, if not using a subagent or the self route.
SKILL.md names 1 domain. As links in the text: timkellogg.me. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Adversarial Review Before Shipping 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.4k tokens (SKILL.md is roughly 14k 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 8.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Adversarial Review Before Shipping: Loop Change Verifier (cobusgreyling/loop-engineering, 11k stars), O2 Review Loop (openobserve/openobserve, 22k stars), Clawteam (win4r/ClawTeam-OpenClaw, 1.5k stars) and OMA Multi-Agent Orchestration (first-fluke/oh-my-agent, 1.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
oaustegard (a GitHub user) maintains it in oaustegard/claude-skills, which has 150 GitHub stars. The repository holds 66 skills in this directory. The repository was last updated on October 8, 2026.
Source: oaustegard/claude-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.