Agent skill

Spec

by strands-agents in strands-agents/box

Walk through spec-driven development, design then requirements, producing a local .spec.md and .requirements.md for one feature.

Apache-2.0Auto-check passedDevelopment

Install Spec

skills CLI
$ npx skills add strands-agents/box --skill spec -a claude-code

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

GitHub CLI
$ gh skill install strands-agents/box spec --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/strands-agents/box.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/spec .claude/skills/spec && 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
spec
GitHub stars
110
Token cost
~4.1k tokens
SKILL.md length
1,524 words
Files
1
Skills in repo
10
Repo updated
First seen
Licence
Apache-2.0

At a glance

Walk through spec-driven development, design then requirements, producing a local .spec.md and .requirements.md for one feature.

  • Works in 2 steps: Design (.spec.md) → Requirements (.requirements.md)
  • Planning a feature before building it
  • SKILL.md covers Skill Invocation, Where a spec lives, First Step: Check what already… and Writing Style: ASD-STE100…, plus 12 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Spec is an agent skill from strands-agents/box. Walk through spec-driven development, design then requirements, producing a local .spec.md and .requirements.md for one feature. Both files are local working material and are never committed. Use when planning a feature before building it.

Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Spec-driven development. The repository describes itself as: Run AI agents in a sandbox that restricts what they can execute, read, write, and reach on the network. Box combines OS isolation with default-deny Dogwood policies and… The licence is Apache-2.0.

When your agent uses it

  • Planning a feature before building it
  • Tasks that involve Spec-driven development

Example prompts

  • “/spec”

Workflow steps

2 steps, taken from the step headings in SKILL.md.

  1. Design (.spec.md)
  2. Requirements (.requirements.md)

What it can do on your machine

Read from SKILL.md and the folder at commit 2c874ea. 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 markdown, mermaid and rust).

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

  • Network

    No URLs in SKILL.md.

    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

Spec loads about 4.1k tokens when it runs. Until then it costs about 61 tokens; SKILL.md has 1,524 words of instructions outside code blocks.

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

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 strands-agents/box at commit 2c874ea, republished under its Apache-2.0 licence (© strands-agents). 1,524 words, ~4,122 tokens.

Download SKILL.mdSave it as .claude/skills/spec/SKILL.md (or your agent's skills folder).
name
spec
description
Walk through spec-driven development, design then requirements, producing a local .spec.md and .requirements.md for one feature. Both files are local working material and are never committed. Use when planning a feature before building it.

Spec Skill

Walk a feature through spec-driven development: two phases, each with a user approval gate.

Design ──[approve]──> Requirements ──[approve]──> build

A spec is local working material, and it is never committed or promoted. It guides one piece of work while that work is being built. When the work lands, the spec has done its job:

What the spec heldWhere it goes when the work lands
Behaviour and its contractThe code and its tests. A test is the durable form of an acceptance criterion.
A decision someone would later ask "why" aboutOne entry in docs/design/decisions.md, through /kd, once the user decides it.
Everything else: options, task lists, open questions, historyNowhere. It stays in the local draft.

docs/design/ pages are written for a reader who was not in the discussion. Write one fresh from the code when one is needed. Never copy or adapt a spec into one.

When implementing a feature, strictly honour its spec. The design (.spec.md) defines the architecture and the decisions, and the requirements define testable behaviour.

Skill Invocation

/spec {area}/{feature}

Start at any phase or resume where you left off:

  • /spec policy/temporal-history: start or continue the spec
  • /spec policy/temporal-history --phase requirements: jump to the requirements phase

Where a spec lives

.agents/drafts/spec/
  {area}/
    YYYY-MM-DD-{desc}.spec.md
    YYYY-MM-DD-{desc}.requirements.md

.gitignore holds /.agents/drafts/, so nothing here is committed. The area names a component, such as box, containment, credentials, egress-gateway, monty, policy, shell, or telemetry. The date and description match across the two files for one effort.

Because the folder is local, a spec exists only in the working tree that wrote it. A second agent or a second clone does not see it. Hand off a spec by path, in chat.

First Step: Check what already exists

Before anything else, read what already owns this area:

  1. ls .agents/drafts/spec/{area}/: a spec effort already in progress here.
  2. docs/design/decisions.md: the decisions already made in this area. A spec does not re-decide one silently. To change one, run /kd on it.
  3. The crate itself: its AGENTS.md, its module docs, and its tests. The code owns behaviour.

Then decide scope, and say it to the user:

  • Extend an existing local spec, or
  • Create a new one for a topic not yet covered.

Writing Style: ASD-STE100 Simplified Technical English

Write every sentence of both artifacts in it: the .spec.md prose and the .requirements.md prose.

  • Use the active voice. Say "the decoder borrows the buffer", not "the buffer is borrowed".
  • Use the present tense. A design states what the system does, not what it will do.
  • Give one idea in one sentence.
  • Keep a descriptive sentence to 25 words or fewer, and an instruction to 20 or fewer.
  • Use one word for one meaning across both files. A term that means two things belongs in the Glossary twice, under two names.
  • Use no metaphor and no idiom.
  • Make no noun cluster of more than three words.
  • Keep a paragraph to six sentences or fewer, and prefer a list to a long sentence.
What the style does not touch
  • EARS is a fixed grammar, and it wins inside an acceptance criterion. Keep WHEN … THE {System_Component} SHALL … exactly as the pattern table specifies. SHALL stays; do not rewrite it to the present tense. Apply the style to the words you choose inside each clause: keep the trigger and the response short, concrete, and free of metaphor.
  • The user-story line keeps its template. As a {role}, I want {functionality}, so that {benefit}. is a fixed shape.
  • Identifiers and glossary terms are not prose. Title_Case terms, type names, config keys, file paths, JSON field names, and status values keep their exact spelling. The three-word noun-cluster limit does not apply to them.
  • The templates control the structure. Section names, KD numbering, and requirement numbering stay as specified. Where the style and a template disagree on wording, the style wins.

Apply the style as a pass over each artifact before the approval gate, not while drafting. Read for a sentence over 25 words, the passive voice, a paragraph over six sentences, metaphor, idiom, and one meaning per word. Use docs/design/terminology.md for the word to use for each thing.


Phase 1: Design (.spec.md)

The design document captures what the system does and why — architecture, key decisions, component interactions, data flow.

Workflow
  1. Gather information — ask the user (one question at a time):

    • What feature or change to document?
    • What problem does it solve? What's the motivation?
    • What alternatives were considered?
    • Any existing code or interfaces to reference?
  2. Draft the design — write Key Decisions with diagrams

  3. Present to user for approval — "Here's the design. Want to adjust anything, or should I proceed to requirements?"

Design Document Template
markdown
# {Feature} — Design

## Overview

{1-3 sentences: what this feature does and why it's needed}

## Architecture

```mermaid
{high-level architecture diagram showing major components and relationships}

Key Decisions

KD-1: {Decision-shaped title}

Context: {What situation led to this decision}

Decision: {What the system does — 1-3 normative sentences only. No reasoning, no alternatives, no history. A reader who stops here knows the behavior.}

Rationale: {Why this over alternatives. All reasoning, tradeoffs, prior art, and justification goes here — clearly separated from the normative Decision above.}

mermaid
{diagram illustrating this decision}

KD-2: {Decision-shaped title}

{...}


Components and Interfaces

{Component 1}

Purpose: {What this component does}

Interface:

rust
// src/path.rs — trait / struct / public fn signature

Data Models

{Data structures, schemas, entity definitions — structs, enums, serde shapes}

Error Handling

{Error categories, error enums / Result types, recovery strategies}

Security Considerations

{Authentication, authorization, data protection, input validation implications}

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

Backward Compatibility

ChangeBackward Compatible?Migration
{API/field/behavior change}Yes / No{How existing callers/data are handled}

Key questions:

  • Can this be rolled back without data loss or manual intervention?
  • Do existing serialized records, crate consumers, or config files continue to work unmodified?
  • If a new field is added, what does its absence/None mean? (Document explicitly — a field name is an implicit contract.)
  • Is this a one-way door (can't un-ship a public API shape) or two-way door (can revert via config/feature flag)?
  • If config-driven, does it activate everywhere simultaneously or use staged rollout?

Accepted Residuals

{What this spec explicitly does NOT cover and why. Every gap should be intentional and stated — silence about a topic reads as "covered" when it may be "out of scope." List each residual with a brief rationale for exclusion.}

  • {Residual 1}: {Why it's out of scope — e.g., handled by another crate, deferred to a future phase, not yet designed}
  • {Residual 2}: {…}

Open Questions

{Threads not yet resolved. Each must annotate which requirements it would affect if resolved differently than currently assumed.}

  • {Question} — Affects: Req {N.M}, {N.M}. {Current assumption and what would change.}

### Key Decision Guidelines

Each KD should be **self-contained**: a reader can understand the decision from just that section.

**Every KD must have a mermaid diagram.** Choose the right type:

| When showing... | Use |
|---|---|
| Data flow or request path | `flowchart LR` or `flowchart TD` |
| State transitions | `stateDiagram-v2` |
| Sequence of operations | `sequenceDiagram` |
| Component relationships | `flowchart TD` with subgraphs |
| Decision tree | `flowchart TD` with diamond nodes |

**Good KD titles** are decision-shaped:
- "Decoder borrows the input buffer (zero-copy)" (not "Decoder")
- "Builder returns `Result` on invalid config" (not "Builder API")
- "Snapshots are append-only" (not "Storage Backend")

**Decision vs Rationale separation:** The Decision field is normative — it states what the system does in 1-3 sentences. A reader scanning KDs for "what does this system do" should be able to read only Decision fields and get a complete picture. All reasoning, tradeoffs, internal research, prior art, LOC estimates, PRD reconciliation, and alternatives go in Rationale. Never mix mechanism justification into the Decision field.

**Backward compatibility:** Every KD that changes existing behavior must state whether the change is backward compatible and what happens to existing data/callers. If the answer is "absence = legacy behavior," document what `None`/missing means explicitly — a field name is an implicit contract.

**KD numbering:** Sequential within each doc (KD-1, KD-2, ...). When extending, continue from the last number. A spec's KD number is local to that spec, so **never cite it from code, a test, or a committed doc**: the spec is not committed, so the citation is dead for every reader. Code cites a decision by its `docs/design/decisions.md` anchor.

**Mermaid tips:**
- One concept per diagram, not the entire system
- Label edges with the important detail (latency, protocol, data format)
- **Quote every edge label**: `A -.->|"read(2)"| B`. Measured: unquoted labels fail the lexer when
  they contain `(` or `|`, and quoting always parses.
- Use subgraphs to group related components
- Prefer `flowchart` over `graph`

**Compile every block — a grep check cannot see a lexer error:**

```sh
export PUPPETEER_EXECUTABLE_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
mmdc -i block.mmd -o /tmp/block.svg

mmdc drives a headless browser and finds none by default, so without that variable it reports a launch failure that reads like "mermaid is unavailable". The output path needs a real extension; -o /dev/null fails on every input and proves nothing.


Phase 2: Requirements (.requirements.md)

Requirements transform the design into testable, formal specifications using EARS notation. Each requirement is traced back to the design and structured as user stories with acceptance criteria.

Workflow
  1. Read the design doc (.spec.md) — extract every behavior, constraint, and edge case
  2. Identify requirement groups — cluster by user story / capability
  3. Draft requirements using EARS patterns
  4. Present to user for approval — "Here are the requirements. Want to adjust anything?"
Requirements Document Template
markdown
# {Feature} — Requirements

## Introduction

{Overview of the feature, what problem it solves, why it's needed. Reference the design doc.}

## Glossary

{Define technical terms, acronyms, component names used in requirements. Use Title_Case for terms that appear in EARS statements to make them unambiguous. A term the whole product uses belongs in docs/design/terminology.md, and this glossary defines spec-specific terms only.}

- **{Term_Name}**: {Definition}

### Scope

{What is included and excluded from this requirements document. All terms used here MUST be defined in the Glossary above.}

## Requirements

### Requirement 1: {Capability Title}

**User Story:** As a {role}, I want {desired functionality}, so that {benefit/value}.

#### Acceptance Criteria

1. WHEN {specific event or trigger} THE {System_Component} SHALL {specific system response}
2. IF {condition or state} THE {System_Component} SHALL {required behavior}
3. WHILE {precondition} WHEN {trigger} THE {System_Component} SHALL {response}

#### Example

{One concrete input → expected output illustrating the happy path. Enough for a test author to see what pass/fail looks like without reverse-engineering the prose.}

### Requirement 2: {Capability Title}

**User Story:** As a {role}, I want {feature}, so that {benefit}.

#### Acceptance Criteria

1. WHEN ...
2. IF ...

#### Example

{...}

{... more requirements ...}

## Non-Functional Requirements

### Backward Compatibility

- WHEN {an existing crate consumer calls without the new field} THE {System} SHALL {behave identically to the current behavior}
- IF {rollback is triggered} THE {System} SHALL {return to previous behavior without manual data migration}
- WHEN {a record serialized before this change is deserialized} THE {System} SHALL {handle absent/None new fields as legacy behavior}

### Performance

{Latency, throughput, allocation, resource consumption requirements}

### Security

{Authentication, authorization, input validation, encryption requirements}

## Definition of Done

- [ ] All acceptance criteria are met
- [ ] Non-functional requirements are satisfied
- [ ] Design decisions are honored
- [ ] Each acceptance criterion is pinned by a named test
- [ ] Each decision a reader would ask "why" about is offered to the user for `/kd`
- [ ] User-facing behaviour that changed is reflected in `docs/user/`
- [ ] Accepted Residuals in the spec are not accidentally implemented or contradicted
EARS Patterns
PatternSyntaxUse when...
UbiquitousTHE {System} SHALL {response}Always true, no trigger needed
Event-drivenWHEN {trigger} THE {System} SHALL {response}Triggered by a specific event
State-drivenWHILE {precondition} THE {System} SHALL {response}Behavior depends on system state
ConditionalIF {condition} THE {System} SHALL {response}Unwanted/exceptional behavior
OptionalWHERE {feature} THE {System} SHALL {response}Feature-dependent behavior
CombinedWHILE {state} WHEN {trigger} THE {System} SHALL {response}Complex multi-condition behavior

Guidelines:

  • Use Title_Case for system components and glossary terms in EARS statements
  • Each acceptance criterion must be independently testable
  • One SHALL per criterion. If a criterion contains AND or multiple SHALL clauses, split it into separate criteria. Each criterion = one assertion = one test case.
  • Acceptance criteria describe observable system behavior only. Documentation obligations (rustdoc, README updates) belong in Definition of Done, not acceptance criteria.
  • Cover happy paths, error paths, and edge cases
  • Number acceptance criteria within each requirement (1, 2, 3...)
  • Reference requirement numbers as {N}.{M} (e.g., 1.1, 2.3) for traceability inside the spec only. Never put Req 1.1 in a code comment or a test: name the test instead.
  • Every requirement MUST include an Example block showing one concrete input → expected output

Phase Transitions

After each phase, explicitly ask for approval before proceeding:

Design → Requirements:

"The design is ready at .agents/drafts/spec/{area}/YYYY-MM-DD-{desc}.spec.md. Review the key decisions and architecture. Want to adjust anything, or should I proceed to requirements?"

Requirements → build:

"The requirements are ready at .agents/drafts/spec/{area}/YYYY-MM-DD-{desc}.requirements.md. Review the acceptance criteria. Want to adjust anything, or should I start building?"

When the work lands, close the spec out in chat rather than in a file:

  • name the test that pins each acceptance criterion;
  • list each key decision that a reader would later ask "why" about, and offer to record it with /kd. Record nothing in decisions.md until the user decides it;
  • name any docs/user/ page the change made stale.

Extending Existing Specs

When extending an existing feature's specs:

  • Design: Continue KD numbering from the last existing KD
  • Requirements: Add new requirement groups, continue numbering
  • Keep the same date prefix if extending the same effort, or use today's date for a new effort

© strands-agents, 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

Files

Just SKILL.md in .agents/skills/spec of strands-agents/box.

Open the folder on GitHubat commit 2c874ea

Compare with similar skills

Spec 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.

Spec compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Spec this skillstrands-agents/box110—~4.1kAutomated safety check: PassApache-2.0
OpenSpec Bulk Change ArchiverFission-AI/OpenSpec71k3 repos~5.6kAutomated safety check: PassMIT
Speckit ConstitutionWeihanLi/WeihanLi.Common24211 repos~2.1kAutomated safety check: PassApache-2.0
Speckit Taskstoissueskunstmusik/blue15419 repos~2kAutomated safety check: PassGPL-3.0
Speckit Analyzekunstmusik/blue15418 repos~3kAutomated safety check: PassGPL-3.0
Review Spdzhu1090093659/spec_driven_develop984—~1.5kAutomated safety check: PassMIT

Similar skills

  • Archives several completed OpenSpec changes in one operation, checking the codebase to resolve spec conflicts rather than archiving blindly.

    71k GitHub starsUsed in 3 repos~5.6k tokens
    DevelopmentAuto-check passed
  • Speckit Constitution

    WeihanLi/WeihanLi.Common

    Create or update the project constitution from interactive or provided principle inputs, ensuring all dependent templates stay in sync.

    242 GitHub starsUsed in 11 repos~2.1k tokens
    DevelopmentAuto-check passed
  • Speckit Taskstoissues

    kunstmusik/blue

    Convert existing tasks into actionable, dependency-ordered GitHub issues for the feature based on available design artifacts.

    154 GitHub starsUsed in 19 repos~2k tokens
    DevelopmentAuto-check passed
  • Speckit Analyze

    kunstmusik/blue

    Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation.

    154 GitHub starsUsed in 18 repos~3k tokens
    DevelopmentAuto-check passed
  • Review Spd

    zhu1090093659/spec_driven_develop

    Findings-first code review workflow for AI coding agents. An agent skill from zhu1090093659/spec_driven_develop.

    984 GitHub stars~1.5k tokensUpdated 2 mo ago
    DevelopmentAuto-check passed
  • Speckit Plan

    kunstmusik/blue

    Execute the implementation planning workflow using the plan template to generate design artifacts.

    154 GitHub starsUsed in 18 repos~2.1k tokens
    DevelopmentAuto-check passed

More from strands-agents/box

All 10 skills in this repo
  • Authoring Box Policy

    strands-agents/box

    Author or edit a Strands Box policy (policy.dw) — turn an operator's natural-language allow/deny intent into a validated Dogwood policy over the box's fixed action vocabulary, including when…

    110 GitHub stars~5.4k tokensUpdated today
    Auto-check passed
  • Debug Os Failure On GitHub

    strands-agents/box

    Debug a CI failure on an OS you are not on (you are on Linux, it fails on macos-latest, or the reverse) without opening a pull request per attempt.

    110 GitHub stars~1.3k tokensUpdated today
    Auto-check: notes
  • Docs Planner

    strands-agents/box

    Find the gaps in the Box documentation and produce a prioritized backlog for docs/user/ and docs/design/.

    110 GitHub stars~743 tokensUpdated today
    Auto-check passed
  • Docs Writer

    strands-agents/box

    Draft or rewrite a Box documentation page in docs/user/ (tutorial, how-to, or reference for an operator) or docs/design/ (explanation for a security evaluator or a contributor), or a crate README.md…

    110 GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Kd

    strands-agents/box

    Deep-dive a SINGLE key decision. An agent skill from strands-agents/box.

    110 GitHub stars~1.3k tokensUpdated today
    Auto-check passed
  • Docs Audit

    strands-agents/box

    Assess an existing Box documentation page (docs/user/, docs/design/, or a crate README.md) for accuracy against the code and its tests, placement, and voice, and recommend what to fix.

    110 GitHub stars~957 tokensUpdated today
    Auto-check passed

Categories

Questions about Spec

What does Spec do?

Walk through spec-driven development, design then requirements, producing a local .spec.md and .requirements.md for one feature. Spec is an agent skill from strands-agents/box.md for one feature.

When should I use Spec?

Spec fits situations like: planning a feature before building it; tasks that involve Spec-driven development.

How do I install Spec in Claude Code?

Run `npx skills add strands-agents/box --skill spec -a claude-code`. Or copy the skill folder (.agents/skills/spec in strands-agents/box) into .claude/skills/spec in your project. Claude Code loads it when a task matches its description.

How do I install Spec in Codex?

Run `npx skills add strands-agents/box --skill spec -a codex`. Or copy the skill folder (.agents/skills/spec in strands-agents/box) into .agents/skills/spec in your project. Codex loads it when a task matches its description.

Can I use Spec 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 strands-agents/box --skill spec -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/spec, .gemini/skills/spec, .github/skills/spec and .opencode/skills/spec in your project.

What does Spec need to run?

SKILL.md names no scripts, command-line tools or credentials: Spec is instructions for the agent only.

Does Spec access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Spec 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 Spec use?

Spec 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.

How many tokens does Spec use?

About 4.1k tokens (SKILL.md is roughly 16k 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 Spec?

Skills that share tags, products or a category with Spec: OpenSpec Bulk Change Archiver (Fission-AI/OpenSpec, 71k stars), Speckit Constitution (WeihanLi/WeihanLi.Common, 242 stars), Speckit Taskstoissues (kunstmusik/blue, 154 stars) and Speckit Analyze (kunstmusik/blue, 154 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Spec?

strands-agents (a GitHub organization) maintains it in strands-agents/box, which has 110 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 8, 2026.

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