Agent skill

Research Web

by WrongStack in WrongStack/WrongStack

A skill your agent uses when searching the web for current, up-to-date data during a research phase — version checks, ecosystem changes, API deprecations, tool comparisons, or any claim that needs…

MITAuto-check passedAgent Workflows

Install Research Web

skills CLI
$ npx skills add WrongStack/WrongStack --skill research-web -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install WrongStack/WrongStack research-web --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/WrongStack/WrongStack.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/core/skills/research-web .claude/skills/research-web && rm -rf skills-src

Use ~/.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/

Facts

Skill name
research-web
GitHub stars
370
Token cost
~3.6k tokens
SKILL.md length
1,023 words
Files
2
Skills in repo
38
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when searching the web for current, up-to-date data during a research phase — version checks, ecosystem changes, API deprecations, tool comparisons, or any claim that needs…

  • Works in 6 steps: Verify before claiming. Never state a… → Two-source minimum. Single-source claims… → Inject, don't repeat. After research,… → …
  • Searching the web for current
  • SKILL.md covers Overview, Rules, Research Workflow Taxonomy and Tool Selection Guide, plus 6 more sections
  • Reaches react.dev

What it does

Research Web is an agent skill from WrongStack/WrongStack. Use this skill when searching the web for current, up-to-date data during a research phase — version checks, ecosystem changes, API deprecations, tool comparisons, or any claim that needs live verification against sources newer than the model's training cutoff. Triggers: user says "research", "current version", "is this still true", "latest", "what's new in", "breaking changes", "find current", "web research", "search the web", "look up".

Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `SKILL.save.md`).

It sits in Agent Workflows, covering Web search and Subagents. The repository describes itself as: An AI coding agent that reads your code, edits files, runs commands, and reasons through bugs — across a terminal REPL, a full-screen TUI, and a browser UI, while you keep your… The licence is MIT.

When your agent uses it

  • Searching the web for current
  • Up-to-date data during a research phase — version checks
  • Ecosystem changes
  • API deprecations

Example prompts

  • “s training cutoff. Triggers: user says”
  • “current version”
  • “is this still true”
  • “/research-web”

Requirements

  • Node.js

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Verify before claiming. Never state a version number, deprecation status,
  2. Two-source minimum. Single-source claims are tentative; two agreeing
  3. Inject, don't repeat. After research, use context_manager with add_note
  4. Respect the stop rule. 2-3 searches + 1-2 fetches per topic. If no clear
  5. Cite every claim. Domain name minimum; date if visible on the page.
  6. Match tool to task. search for discovery; fetch to read a known page

What it can do on your machine

Read from SKILL.md and the folder at commit 57f6018. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • react.dev

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Research Web loads about 3.6k tokens when it runs. Until then it costs about 114 tokens; SKILL.md has 1,023 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~114
When it runs · the whole SKILL.md, loaded when a task matches
~3.6k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from WrongStack/WrongStack at commit 57f6018, republished under its MIT licence (© WrongStack). 1,023 words, ~3,575 tokens.

Download SKILL.mdSave it as .claude/skills/research-web/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
research-web
description
Use this skill when searching the web for current, up-to-date data during a research phase — version checks, ecosystem changes, API deprecations, tool comparisons, or any claim that needs live verification against sources newer than the model's training cutoff. Triggers: user says "research", "current version", "is this still true", "latest", "what's new in", "breaking changes", "find current", "web research", "search the web", "look up".
version
1.1.0
required-capabilities
web.research
required-tools
context_manager, delegate, fetch, search
optional-capabilities
runtime.admin

Research Web — WrongStack

Overview

Teaches the agent how to conduct current-data web research with discipline: when to search, how to cross-validate, how to inject findings for reuse, and how to delegate research to subagents. Complements the research-web mode (which provides tool prioritization and behavioral gating); this skill provides the deep methodology and patterns the mode prompt can't fit.

Rules

  1. Verify before claiming. Never state a version number, deprecation status, or API surface from training data without a live check.
  2. Two-source minimum. Single-source claims are tentative; two agreeing sources is a signal; three is confirmation.
  3. Inject, don't repeat. After research, use context_manager with add_note to inject a structured summary. Never re-research the same topic.
  4. Respect the stop rule. 2-3 searches + 1-2 fetches per topic. If no clear answer after that, surface the ambiguity rather than research-looping.
  5. Cite every claim. Domain name minimum; date if visible on the page.
  6. Match tool to task. search for discovery; fetch to read a known page or a raw registry/API endpoint.

Research Workflow Taxonomy

Not every research task needs the same approach. Match the workflow to the need:

Quick Lookup (1-2 turns)

When: "What's the latest version of React?" "Is package X still maintained?" Pattern:

search("React latest stable version 2025")  →  discover version
fetch("https://react.dev/versions")          →  verify against authoritative source
context_manager add_note("## Research: React version\n- 19.2.0 (March 2025)\n- Source: react.dev")

Budget: 1 search + 1 fetch = ~2000 tokens. Done in one turn.

Deep Investigation (3-4 turns)

When: "How has Next.js middleware changed across 14.x → 15.x?" Pattern:

Turn 1: search("Next.js middleware changes 14 to 15") → collect URLs
Turn 2: fetch(upgrade guide), fetch(changelog)     → parallel fetches
Turn 3: cross-reference, inject structured findings

Budget: 2 searches + 2-3 fetches = ~5000 tokens. Use parallel fetches.

Landscape Survey (fan-out)

When: "Compare the top 5 React state management libraries in 2025" Pattern: Delegate to subagents. Each researches one library, leader aggregates. See "Subagent Delegation" section below.

Tool Selection Guide

ToolBest forAvoid for
searchBroad discovery, finding current URLs, getting an overviewDeep detail (use fetch after)
fetchReading a specific page for detail, authoritative confirmationBroad queries (use search first)
context_managerInjecting research findings into conversation for future turnsResearch itself (this is the output tool)
Decision heuristic
                   ┌─────────────────┐
                   │ What do I need? │
                   └────────┬────────┘
           ┌────────────────┼────────────────┐
           ▼                ▼                 ▼
     "Discover URLs"   "Read a page"    "Raw API data"
           │                │                 │
     search        fetch           fetch
           │                │
           └────────┬───────┘
                    ▼
            context_manager
              add_note

Source Quality Evaluation

Rate every source before citing it:

TierExamplesTrust
PrimaryOfficial docs, GitHub releases, registry APIs, RFCsCite as fact
SecondaryWell-known tech blogs, conference talks by maintainersCite with "according to"
TertiaryStack Overflow, Reddit, personal blogs, LLM-generated contentCorroborate before citing

Recency check:

  • Package version: must be ≤ 6 months old to claim "current"
  • API change: must reference the specific version that introduced it
  • Deprecation claim: must cite the deprecation notice (not just "I heard")
  • Ecosystem trend: multiple sources from the current year

Injection Format Templates

Structured add_note formats for different research outcomes. The format matters — future turns need to parse these quickly without re-reading raw search results.

Version check
## Research: [package] version
- Current latest: [version] ([date])
- Previous: [version] (for context)
- Registry source: [npm/pypi/crates.io URL]
- Confirmed via: [source URL]
API / breaking change
## Research: [package] [feature] changes
- [Version]: [what changed]
- [Version]: [what changed]
- Breaking: [list of breaks]
- Migration path: [if documented]
- Source: [upgrade guide URL]
Ecosystem comparison
## Research: [topic] comparison
- [Tool A]: [key points, version, status]
- [Tool B]: [key points, version, status]
- Recommendation: [with rationale]
- Sources: [URL, URL]
## Research: [topic] — no current changes found
- Searched: [query, query]
- Result: No breaking changes / deprecations / version bumps found
- Checked on: [date]

Always include a null-result note. Without it, future turns may re-research the same topic thinking the data was never gathered.

Subagent Delegation

For landscape surveys and parallel research, delegate to subagents carrying this skill. The research and search roster roles are tuned for this.

Fan-out pattern (parallel)
typescript
// Leader: fan out one topic per subagent
batch_tool_use([
  {
    tool: "delegate",
    input: {
      task: "Research current state of Zustand: latest version, breaking changes in 5.x, ecosystem position. Inject findings via context_manager.",
      role: "research"
    }
  },
  {
    tool: "delegate",
    input: {
      task: "Research current state of Jotai: latest version, breaking changes, ecosystem position. Inject findings via context_manager.",
      role: "research"
    }
  },
  {
    tool: "delegate",
    input: {
      task: "Research current state of Valtio: latest version, breaking changes, ecosystem position. Inject findings via context_manager.",
      role: "research"
    }
  },
])
Sequential deep-dive
typescript
// Leader: one topic, phased research
delegate({
  task: "Research React 19 Server Components: what changed from 18→19, current best practices for 'use client' boundaries, known pitfalls. Cross-reference react.dev docs and the GitHub release notes. Inject structured findings.",
  role: "research"
})
Subagent budget guidance
Research typemaxIterationsmaxToolCallsNotes
Quick lookup361 search + 1 fetch + inject
Deep investigation820Multiple searches + cross-ref
Landscape survey1230Multiple searches + fetches per topic

Cross-Validation Patterns

When sources agree
Source A (official docs): React 19.2.0
Source B (npm registry):  19.2.0
Source C (GitHub releases): 19.2.0
→ Cite as confirmed. No need to fetch a 4th source.
When sources disagree
Source A (blog post):       Next.js 15.2 deprecated middleware edge runtime
Source B (official docs):   Middleware now defaults to Node.js, edge still available
→ Dig deeper. The blog conflated "default change" with "deprecation".
→ Fetch the actual upgrade guide for the precise language.
→ Flag the disagreement in your findings.
When only one source exists
Source A (GitHub issue comment): "This API is being removed in v4"
→ Mark as TENTATIVE. State: "One source claims... cannot confirm."
→ If the claim is critical, search specifically for confirmation.
→ Otherwise, move on — don't spend budget chasing unconfirmed rumors.

Cost Awareness

ActionApproximate costWhen to use
search (5 results)~500 tokensAlways first — cheap discovery
fetch (single page)~1000-2000 tokensOnly for authoritative sources
context_manager add_note~0 tokens (metadata op)After every research cycle
delegate (quick lookup subagent)~$0.05-0.15When research would bloat your context
delegate (deep investigation)~$0.20-0.50Landscape surveys only

Rule of thumb: Don't spend more on research than the answer is worth. A version check shouldn't cost $0.50. A landscape survey justifying an architecture decision might be worth $2.00.

Show full SKILL.md (397 more words)Show less

Anti-Patterns

Re-researching known data
typescript
// ❌ Turn 5: Agent forgets it already researched React version
search("React latest version")

// ✅ Turn 2: Agent injected findings via add_note
// Turn 3-5: Agent sees the note in conversation — skips re-search
Fetching without searching first
typescript
// ❌ Guessing URLs wastes fetches
fetch("https://react.dev/blog/2025/03/15/react-19-2")  // 404

// ✅ Search discovers the real URL first
search("React 19.2 release blog post")
fetch(<result from search>)
Injecting raw dumps
typescript
// ❌ Bloating context with raw JSON
context_manager add_note(JSON.stringify(searchResults))

// ✅ Structured summary
context_manager add_note("## Research: React version\n- 19.2.0\n- Source: react.dev")
Single-source claims
typescript
// ❌ One blog post becomes "truth"
"The React team recommends X"  — based on one Medium article from 2023

// ✅ Cross-referenced
"The React docs recommend Y (react.dev). A 2024 blog post also suggests Y.
One 2023 article suggests X, but this appears outdated."
Research-looping
typescript
// ❌ 7 searches on the same topic, each slightly rephrased
search("React 19 new features")
search("React 19 what changed")
search("React 19 release notes changes")
search("React 19 difference from 18")
// ...

// ✅ 1-2 broad searches, then targeted fetches
search("React 19 release notes breaking changes")
fetch(<react.dev blog>)
fetch(<GitHub releases>)
// Done. Inject findings.
Researching during tactical work
typescript
// ❌ User asks for a quick null-check fix, agent starts web searching
User: "fix the null deref in auth.ts line 42"
Agent: search("TypeScript null check best practices") // NO

// ✅ Research mode is for analysis/discussion phases, not tactical edits
// The agent already knows how to fix a null deref — just fix it.

Workflow

1. TRIGGER    — User asks for current data OR agent realizes knowledge is stale
2. CLASSIFY   — Quick lookup? Deep investigation? Landscape survey?
3. SEARCH     — search with 5-8 results for broad discovery
4. FETCH      — fetch 1-2 authoritative results for detail (parallelize if >1)
5. VALIDATE   — Cross-reference: 2+ sources agree? Flag single-source claims
6. INJECT     — context_manager add_note with structured findings
7. CITE       — In your response, cite sources for every factual claim

Out of scope

  • Don't claim a version, deprecation, or API surface from training memory. Verify against a live source. The cutoff is wrong; the registry is right.
  • Don't research-loop. 2–3 searches + 1–2 fetches per topic. If the answer isn't there after that, surface the ambiguity, don't keep searching.
  • Don't re-research what you've already injected. Once a finding is in context_manager notes, future turns see it. Re-searching the same topic is a context-bloat failure.
  • Don't fetch URLs you guessed. Search first, fetch the result. fetch("https://react.dev/blog/2025/03/15/...") is a 404 waiting to happen.
  • Don't inject raw search results. Inject a structured summary, not a JSON dump of search(...). Future turns need to parse, not re-read.
  • Don't cite a single source as fact. Two-source minimum for a claim; one-source is tentative. Tertiary sources (Reddit, SO, LLM-generated content) need corroboration.
  • Don't accept a Medium post as ground truth. Source tiers matter: primary (official docs, GitHub, registries) is fact; secondary is "according to"; tertiary needs corroboration.
  • Don't research during tactical work. "Fix the null deref" doesn't need web search. Research mode is for analysis and discussion phases, not bug fixes.
  • Don't skip the null-result note. A "no current changes found" note prevents the next turn from re-researching the same topic. Always include it.
  • Don't spend $0.50 on a version check. Cost awareness: a quick lookup is 1 search + 1 fetch ≈ 2000 tokens. Landscape surveys justify $2.00; version checks don't.

Before returning

  • Every claim cites a source URL; domain minimum, date when visible
  • Two-source minimum for important claims; single-source labeled tentative
  • Tertiary sources corroborated before citing
  • Recency checked: version claims ≤ 6 months old; ecosystem trends from current year
  • Findings injected via context_manager add_note with structured summary
  • Null-result note included when no current changes found
  • Search→fetch→validate→inject→cite workflow followed
  • Stop rule honored: 2–3 searches + 1–2 fetches per topic; no loops
  • Cost aligned with answer value; no $0.50 version checks
  • No research done for tactical work that doesn't need it
  • <nextsteps> lists any open follow-up research or pending validation

Skills in scope

  • tech-stack — for package version verification and ecosystem validation
  • node-modern — for Node.js-specific version and API checks
  • react-modern — for React-specific version and API checks
  • security-scanner — for CVE and vulnerability research
  • prompt-engineering — for crafting effective search queries
  • multi-agent — for fanning out research to subagents
  • output-standards — for standardized <nextsteps> formatting

© WrongStack, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in packages/core/skills/research-web of WrongStack/WrongStack.

  • SKILL.md
  • SKILL.save.md

Open the folder on GitHubat commit 57f6018

Compare with similar skills

Research Web 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.

Research Web compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Research Web this skillWrongStack/WrongStack370—~3.6kAutomated safety check: PassMIT
External Context ResearchYeachan-Heo/oh-my-claudecode40k—~545Automated safety check: PassMIT
Hanzi Browsehanzili/hanzi-browse177—~2.4kAutomated safety check: PassCustom licence
Web ResearchJuncai22/spring-ai-agent-learning1233 repos~1.1kAutomated safety check: PassApache-2.0
Pi AgentK-Dense-AI/scientific-agent-skills48k1 repos~2.1kAutomated safety check: PassMIT
WebGPTNhahan/WebGPT117—~1.4kAutomated safety check: PassMIT

Similar skills

  • External Context Research

    Yeachan-Heo/oh-my-claudecode

    Breaks a research question into two to five facets and sends parallel document-specialist agents to search the web and documentation, then merges the results.

    40k GitHub stars~545 tokensUpdated today
    Agent WorkflowsAuto-check passed
  • Hanzi Browse

    hanzili/hanzi-browse

    Delegates a browsing task to a sub-agent running in the USER'S OWN Chrome — the browser they have open right now, already signed into everything.

    177 GitHub stars~2.4k tokensUpdated 5 mo ago
    Productivity & AutomationAuto-check passed
  • Web Research

    Juncai22/spring-ai-agent-learning

    A skill your agent uses for requests related to web research; it provides a structured approach to conducting comprehensive web research

    123 GitHub starsUsed in 3 repos~1.1k tokens
    Research & ScienceAuto-check passed
  • Pi Agent

    K-Dense-AI/scientific-agent-skills

    Builds with and operates Pi, the minimal terminal coding harness.

    48k GitHub starsUsed in 1 repo~2.1k tokens
    AI & LLM EngineeringAuto-check passed
  • WebGPT

    Nhahan/WebGPT

    Hands bounded tasks from Codex to a signed-in ChatGPT web session at a chosen reasoning level, or opens a terminal chat in your project that you control.

    117 GitHub stars~1.4k tokensUpdated 15 days ago
    Agent WorkflowsAuto-check passed
  • Verified Research

    sweetcornna/free-search-mcp

    Use with the free-search MCP tools whenever a web lookup must yield facts someone will rely on: dates, deadlines, prices, prizes, fees, rules, eligibility, schedules, versions, statistics, news, or…

    116 GitHub stars~1.8k tokensUpdated 3 days ago
    Agent WorkflowsAuto-check passed

More from WrongStack/WrongStack

All 38 skills in this repo
  • Design Craft

    WrongStack/WrongStack

    Design or substantially improve user-facing interfaces with a product-specific visual direction, content hierarchy, and rendered critique.

    370 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Design Critique

    WrongStack/WrongStack

    A skill your agent uses to audit an interface that already exists and say precisely why it looks generated, templated, or unfinished — a scored rubric across composition, typography, color, states…

    370 GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Mailbox Bridge

    WrongStack/WrongStack

    A skill your agent uses when external coding agents (Claude Code, Aider, custom scripts) need to participate in the project's shared WrongStack mailbox, or when a user asks to "expose the mailbox"…

    370 GitHub stars~3.9k tokensUpdated today
    Auto-check passed
  • Multi Agent

    WrongStack/WrongStack

    A skill your agent uses whenever work can be split across multiple AI agents running in parallel, or when orchestrating leader/worker patterns in WrongStack.

    370 GitHub stars~3.6k tokensUpdated today
    Auto-check passed
  • Web Platform Baseline

    WrongStack/WrongStack

    Use this skill before asserting that a CSS, HTML or accessibility capability is available, unavailable, or the right tool — it carries dated, refreshable platform facts and refuses to let stale…

    370 GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Wrongstack Mailbox

    WrongStack/WrongStack

    A skill your agent uses when the user wants to communicate with WrongStack's shared project mailbox from outside WrongStack — read messages sent by WrongStack agents, send replies, broadcast to all…

    370 GitHub stars~3.5k tokensUpdated today
    Auto-check passed

Questions about Research Web

What does Research Web do?

A skill your agent uses when searching the web for current, up-to-date data during a research phase — version checks, ecosystem changes, API deprecations, tool comparisons, or any claim that needs…. Research Web is an agent skill from WrongStack/WrongStack. Use this skill when searching the web for current, up-to-date data during a research phase — version checks, ecosystem changes, API deprecations, tool comparisons, or any claim that needs live verification against sources newer than the model's training cutoff.

When should I use Research Web?

Research Web fits situations like: searching the web for current; up-to-date data during a research phase — version checks; ecosystem changes; API deprecations.

How do I install Research Web in Claude Code?

Run `npx skills add WrongStack/WrongStack --skill research-web -a claude-code`. Or copy the skill folder (packages/core/skills/research-web in WrongStack/WrongStack) into .claude/skills/research-web in your project. Claude Code loads it when a task matches its description.

How do I install Research Web in Codex?

Run `npx skills add WrongStack/WrongStack --skill research-web -a codex`. Or copy the skill folder (packages/core/skills/research-web in WrongStack/WrongStack) into .agents/skills/research-web in your project. Codex loads it when a task matches its description.

Can I use Research Web in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add WrongStack/WrongStack --skill research-web -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/research-web, .gemini/skills/research-web, .github/skills/research-web and .opencode/skills/research-web in your project.

What does Research Web need to run?

SKILL.md names no scripts, command-line tools or credentials: Research Web is instructions for the agent only. Our summary lists: Node.js.

Does Research Web access the network?

SKILL.md names 1 domain. In commands or code: react.dev; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Research Web safe to install?

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.

What licence does Research Web use?

Research Web is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Research Web use?

About 3.6k 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.

What are the alternatives to Research Web?

Skills that share tags, products or a category with Research Web: External Context Research (Yeachan-Heo/oh-my-claudecode, 40k stars), Hanzi Browse (hanzili/hanzi-browse, 177 stars), Web Research (Juncai22/spring-ai-agent-learning, 123 stars) and Pi Agent (K-Dense-AI/scientific-agent-skills, 48k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Research Web?

WrongStack (a GitHub organization) maintains it in WrongStack/WrongStack, which has 370 GitHub stars. The repository holds 38 skills in this directory. The repository was last updated on October 7, 2026.

Source: WrongStack/WrongStack on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.