Agent skill

Fhirpath Test Designer

by aehrc in aehrc/pathling

Design and generate comprehensive FHIRPath test suites using input domain partitioning and Pathling's DSL test framework.

Apache-2.0Auto-check passedTesting & QA

Install Fhirpath Test Designer

skills CLI
$ npx skills add aehrc/pathling --skill fhirpath-test-designer -a claude-code

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

GitHub CLI
$ gh skill install aehrc/pathling fhirpath-test-designer --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/aehrc/pathling.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/fhirpath-test-designer .claude/skills/fhirpath-test-designer && 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
fhirpath-test-designer
GitHub stars
137
Token cost
~3.6k tokens
SKILL.md length
1,409 words
Files
2 (incl. references)
Skills in repo
25
Repo updated
First seen
Licence
Apache-2.0

At a glance

Design and generate comprehensive FHIRPath test suites using input domain partitioning and Pathling's DSL test framework.

  • Works in 3 steps: Spec research → Test matrix design → Code generation
  • The user asks to write tests for a FHIRPath feature (function
  • SKILL.md covers Workflow, DSL reference, Gotchas and Running the tests, plus 2 more sections
  • Calls mvn; reaches loinc.org

What it does

Fhirpath Test Designer is an agent skill from aehrc/pathling. Design and generate comprehensive FHIRPath test suites using input domain partitioning and Pathling's DSL test framework. Use this skill whenever the user asks to write tests for a FHIRPath feature (function, operator, type system behavior, traversal pattern, etc.), review existing test coverage, identify missing test cases, or discuss what dimensions a feature needs testing across. Trigger on phrases like "write tests for", "test coverage for", "what tests do we need for", "review tests for", or any mention of…

Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/DSL_Testing_Strategy.md`).

It sits in Testing & QA, covering Test generation and Test coverage. The repository describes itself as: Tools that make it easier to use FHIR and clinical terminology within data analytics, built on Apache Spark. The licence is Apache-2.0.

When your agent uses it

  • The user asks to write tests for a FHIRPath feature (function
  • Type system behavior
  • Traversal pattern
  • Review existing test coverage

Example prompts

  • “write tests for”
  • “test coverage for”
  • “what tests do we need for”
  • “/fhirpath-test-designer”

Workflow steps

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

  1. Spec research
  2. Test matrix design
  3. Code generation

What it can do on your machine

Read from SKILL.md and the folder at commit 56a3b4a. 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

    Shell commands in SKILL.md call:

    • mvn

    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:

    • loinc.org

    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

Fhirpath Test Designer loads about 3.6k tokens when it runs, and up to ~5.1k if it reads all its reference files. Until then it costs about 184 tokens; SKILL.md has 1,409 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~184
When it runs · the whole SKILL.md, loaded when a task matches
~3.6k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~5.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 aehrc/pathling at commit 56a3b4a, republished under its Apache-2.0 licence (© aehrc). 1,409 words, ~3,601 tokens.

Download SKILL.mdSave it as .claude/skills/fhirpath-test-designer/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
fhirpath-test-designer
description
Design and generate comprehensive FHIRPath test suites using input domain partitioning and Pathling's DSL test framework. Use this skill whenever the user asks to write tests for a FHIRPath feature (function, operator, type system behavior, traversal pattern, etc.), review existing test coverage, identify missing test cases, or discuss what dimensions a feature needs testing across. Trigger on phrases like "write tests for", "test coverage for", "what tests do we need for", "review tests for", or any mention of testing a specific FHIRPath feature. Also trigger when the user mentions testing dimensions like singular/plural, empty propagation, cardinality, or HAPI resources in the context of FHIRPath tests.

FHIRPath Test Designer

You design and generate FHIRPath test suites by combining specification research, input domain partitioning, and Pathling's fluent DSL. Your output is a test matrix reviewed by the user, followed by generated test code.

The DSL reference below is authoritative — it was derived from fhirpath/src/test/java/au/csiro/pathling/test/dsl/, and DslApiContractTest in that package exercises every construct documented here. If a method you want does not appear below, read the package rather than assuming it exists.

references/DSL_Testing_Strategy.md sets out the reasoning behind the partitioning approach — read it when deciding whether a dimension is worth testing, or when justifying a matrix to a reviewer.

Workflow

Three phases. Present findings to the user between phases.

Accepts --unattended when dispatched by a caller that has no user to present to (e.g. implement-pathling --unattended). Under --unattended, skip the "present and wait" step between phases and proceed straight through with the best matrix the spec supports — but never suppress an uncertain case to make the pipeline flow smoothly. Carry every case flagged uncertain (see Phase 2) into the final output so the caller can report it rather than silently deciding it.

Phase 1: Spec research

Use the fhirpath-spec skill for all specification lookups. Gather:

  • Signature and description
  • Input/output types and collection behaviour
  • All spec examples — these become mandatory test cases
  • Edge cases the spec calls out (empty propagation, boundary conditions, error conditions)
  • FHIR-specific considerations (choice types, primitive wrappers, extensions)
  • Ambiguities where the spec is unclear or reference implementations diverge

Flag ambiguities for resolution before Phase 2 — interactively, or, under --unattended, as an uncertain case carried into the matrix rather than resolved silently. Expected results come from the spec, never from running the implementation.

Phase 2: Test matrix design

Apply input domain partitioning. The driving question:

What inputs can this function receive, and what does the spec say should happen for each?

DimensionPartitionsWhen relevant
Core semanticsSpec examples, basic behaviourAlways
Emptiness{} literal, typed-empty field (stringEmpty), computed empty (where(false))Always, for anything accepting collections
CardinalitySingular value vs arrayWhenever the function reads model fields — see below
Element typePrimitive, complex/backbone, choice typeWhen the function accepts general Element input
NestingFlat, nested, deeply nestedWhen the function involves traversal
FHIR encodingReal resource via withResourceWhen behaviour depends on genuine FHIR encoding — see below

Cardinality deserves special attention. In the Spark layer, singular elements are scalar columns and non-singular elements are array columns. A function correct on a scalar column can fail on an array column and vice versa. Include at least one singular field (.string("s", "v")) and one array field whenever the function reads model fields.

For a function that expects a singleton input — true of most scalar functions, string and math functions among them — the array field must hold exactly one item (.stringArray("a", "v")): the point of this dimension is to prove scalar coercion works on an array-backed column, not to test multi-item behaviour. A separate array field with more than one item (.stringArray("a", "x", "y")) is a different case: FHIRPath's singleton evaluation rules make multiple items an error, not an element-wise map, so it belongs under core semantics as a testError case, not under cardinality. Only expect an array field with several items to map or aggregate when the function is documented to operate over the whole collection (an existence or aggregate function such as count() or exists()).

When to require a real FHIR resource (withResource) — the map-based builder produces a synthetic resource whose type is always Test, so it cannot express:

  • Real resource types and resource-prefixed paths (Patient.name.given)
  • Choice types (value[x]) as HAPI actually serialises them
  • Reference resolution (resolve()) and contained resources
  • Extensions and FHIR primitive-wrapper behaviour (getValue(), hasValue())
  • Anything where the Spark schema from real FHIR JSON differs from the map schema

Otherwise prefer withSubject — it is faster to read and write.

Present a matrix and wait for review. Under --unattended, produce the same matrix but proceed straight to Phase 3 without waiting:

markdown
## Test matrix for `functionName()`

| # | Test case | Dimension | Expression | Expected | Subject |
|---|-----------|-----------|------------|----------|---------|
| 1 | Spec example | Core semantics | `'abc'.fn()` | `'ABC'` | literal |
| 2 | Empty literal | Emptiness | `{}.fn()` | `{}` | literal |
| 3 | Typed-empty field | Emptiness | `emptyString.fn()` | `{}` | subject |
| 4 | Singular field | Cardinality | `singleString.fn()` | `'V'` | subject |
| 5 | Array field, one item | Cardinality | `arrayOfOne.fn()` | `'V'` | subject |
| 6 | Array field, multiple items | Core semantics | `stringArray.fn()` | error | subject |
| 7 | Choice type | Element type | `Observation.value.ofType(string).fn()` | ... | resource |

Rules:

  • Vary one dimension at a time; hold the others constant
  • Combination tests only where the spec implies dimensions interact
  • Do not combinatorially explode independent dimensions
  • Flag any case whose expected result is uncertain
Phase 3: Code generation

DSL reference

Location and naming. Tests live in fhirpath/src/test/java/au/csiro/pathling/fhirpath/dsl/, named <Capability>DslTest.java — by capability (StringFunctionsDslTest), never by issue number. Extend FhirPathDslTestBase. Every file needs the CSIRO Apache-2.0 copyright header; copy it from a sibling test.

One @FhirPathTest method per function, using group() to organise dimensions within it — except where the DSL's one-subject-per-method constraint (Gotcha 1 below) forces a split. A function needing both synthetic-subject and real-FHIR-resource coverage cannot fit one method; split by subject, not by dimension, as ExistenceFunctionsDslTest does for count() (testCount() and testCountOnFhirResource()).

java
package au.csiro.pathling.fhirpath.dsl;

import au.csiro.pathling.test.dsl.FhirPathDslTestBase;
import au.csiro.pathling.test.dsl.FhirPathTest;
import java.util.stream.Stream;
import org.junit.jupiter.api.DynamicTest;

public class StringFunctionsDslTest extends FhirPathDslTestBase {

  @FhirPathTest
  public Stream<DynamicTest> testUpper() {
    return builder()
        .withSubject(
            sb ->
                sb.stringEmpty("emptyString")
                    .string("singleString", "test")
                    .stringArray("arrayOfOne", "test")
                    .stringArray("stringArray", "one", "two"))
        .group("upper() spec examples")
        .testEquals("ABCDEFG", "'abcdefg'.upper()", "Lowercase input is uppercased")
        .group("upper() empty propagation")
        .testEmpty("{}.upper()", "Empty literal returns empty")
        .testEmpty("emptyString.upper()", "Typed-empty field returns empty")
        .group("upper() cardinality")
        .testEquals("TEST", "singleString.upper()", "Singular field")
        .testEquals("TEST", "arrayOfOne.upper()", "Array-backed field with one item")
        .group("upper() core semantics")
        .testError("stringArray.upper()", "Multiple items in the input is an error")
        .build();
  }
}
Subject methods
MethodNotes
withSubject(sb -> ...)Map-based synthetic resource. Fields are accessed bare — stringArray.first(), no resource-type prefix
withSubject(Map<String, Object>)Pre-built model map
withResource(IBaseResource)Real HAPI resource. Expressions are normally resource-prefixed — Patient.name.given
Show full SKILL.md (604 more words)Show less
Assertions — a description is mandatory on every one
MethodSignature
testEquals(Object expected, String expression, String description)
testTrue(String expression, String description)
testFalse(String expression, String description)
testEmpty(String expression, String description)
testError(String expression, String description) — any error
testError(String errorMessage, String expression, String description) — specific message
group(String groupName) — prefixes subsequent descriptions as group - description
test(String description, tc -> tc.expression(...).expectResult(...)) — low-level escape hatch
buildTerminates the chain, returns Stream<DynamicTest>

There are no overloads without a description. testEquals(expected, expression) does not compile.

Model builder methods (FhirPathModelBuilder)

Each type has a value form, an empty form, and an array form:

TypeValueEmptyArray
Stringstring(n, v)stringEmpty(n)stringArray(n, ...)
Integerinteger(n, v)integerEmpty(n)integerArray(n, ...)
Decimaldecimal(n, v)decimalEmpty(n)decimalArray(n, ...)
Booleanbool(n, v)boolEmpty(n)boolArray(n, ...)
Datedate(n, v)dateEmpty(n)dateArray(n, ...)
DateTimedateTime(n, v)dateTimeEmpty(n)dateTimeArray(n, ...)
Timetime(n, v)timeEmpty(n)timeArray(n, ...)
Codingcoding(n, v)codingEmpty(n)codingArray(n, ...)
Quantityquantity(n, v)quantityEmpty(n)quantityArray(n, ...)
Complexelement(n, b -> ...)elementEmpty(n)elementArray(n, b1, b2, ...)

elementEmpty(n) creates field n carrying a null value — the field is present. It is not an absent field; no builder method produces one (see gotcha 7).

Date, DateTime, Time, Coding and Quantity take FHIRPath literal strings — date("d", "2024-01-15"), quantity("q", "10.5 'mg'"), coding("c", "http://loinc.org|1234-5").

Also available: fhirType(FHIRDefinedType) to annotate the FHIR type of the enclosing element, choice(name) to mark a choice element, and fhirReference() for a Reference with empty reference and type fields.

For type() assertions, import au.csiro.pathling.test.dsl.TypeInfoExpectation.toTypeInfo and compare against toTypeInfo("System.Integer(System.Any)") or toTypeInfo("FHIR.Patient(FHIR.Resource)").

Gotchas

These are the ways generated tests actually break:

  1. One subject per method. withSubject and withResource set builder state consumed at build() — they are not scoped to a group(). Calling either twice in one method means the last call applies to every test case in that method. If two tests need different subjects, they need different @FhirPathTest methods.
  2. withSubject and withResource are mutually exclusive — each clears the other.
  3. The map-based subject's resource type is always Test. Resource-prefixed expressions like Patient.name will not resolve. Use withResource for those.
  4. testError takes a message string, not an exception class. testError(SomeException.class, ...) does not compile.
  5. There is no context(...) argument. The DSL hardcodes the test case's context to null. If a test genuinely needs a context expression, write it as a YAML case under fhirpath/src/test/resources/fhirpath-ptl/ instead.
  6. A single-element List.of(x) expectation is unwrapped to x before comparison, so both forms are equivalent for one-item results. Use the bare value for readability.
  7. Typed-empty, null-valued and absent are three different things. stringEmpty("f") creates field f with a typed null. elementEmpty("f") creates field f with a plain null. Omitting the field entirely means the path does not resolve, which is a different condition again — and no builder method produces it, so an "absent field" row in a matrix has to be written by leaving the field out. Test the dimension the spec cares about, and say which one you meant.
  8. group() persists until the next group() call.

Running the tests

bash
mvn test -pl fhirpath -Dtest=StringFunctionsDslTest              # one class
mvn test -pl fhirpath -Dtest='StringFunctionsDslTest#testUpper'  # one method
mvn spotless:apply -pl fhirpath                                  # format

Reviewing existing tests

  1. Run Phase 1 for the function under test.
  2. Build the matrix as if writing from scratch.
  3. Compare against the existing tests and report:
    • Missing dimensions — matrix rows with no corresponding test
    • Incorrect expectations — assertions that contradict the spec
    • Redundant tests — several tests covering one dimension without adding value
    • Missing FHIR-encoding coverage — features needing withResource that only use withSubject

What not to test

  • Unicode/emoji handling unless the spec defines it
  • Large inputs or performance characteristics
  • Multiple variations of an identical condition
  • Exhaustive type combinations beyond what the spec defines
  • Cross-cutting infrastructure (empty propagation at the column level, type encoding) already covered once at the infrastructure level — unless this function behaves unusually

© aehrc, 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

SKILL.md and 1 other file (references) in .claude/skills/fhirpath-test-designer of aehrc/pathling.

  • SKILL.md
  • references/DSL_Testing_Strategy.md

Open the folder on GitHubat commit 56a3b4a

Compare with similar skills

Fhirpath Test Designer 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.

Fhirpath Test Designer compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Fhirpath Test Designer this skillaehrc/pathling137—~3.6kAutomated safety check: PassApache-2.0
Senior QAnicepkg/auto-company1943 repos~1.1kAutomated safety check: NotesNone
OpenROAD Module Test AdderThe-OpenROAD-Project/OpenROAD3.2k—~1.8kAutomated safety check: PassBSD-3-Clause
Find Untested Sourcesdotnet/skills5.6k1 repos~3.3kAutomated safety check: PassMIT
Testing iOS Codebitwarden/ios696—~1.8kAutomated safety check: PassGPL-3.0
Caliber Testingcaliber-ai-org/ai-setup1.3k—~3.2kAutomated safety check: PassMIT

Similar skills

  • Senior QA

    nicepkg/auto-company

    Comprehensive QA and testing skill for quality assurance, test automation, and testing strategies for ReactJS, NextJS, NodeJS applications.

    194 GitHub starsUsed in 3 repos~1.1k tokens
    Testing & QAAuto-check: notes
  • OpenROAD Module Test Adder

    The-OpenROAD-Project/OpenROAD

    Adds integration or unit tests to an OpenROAD module: writes the Tcl test, generates golden files and registers it in both CMake and Bazel.

    3.2k GitHub stars~1.8k tokensUpdated today
    Testing & QAAuto-check passed
  • Official

    Statically pairs source files with test files to list code that no test references, using Roslyn for C# or tree-sitter for many languages, with no build.

    5.6k GitHub starsUsed in 1 repo~3.3k tokens
    Testing & QAAuto-check passed
  • Testing iOS Code

    bitwarden/ios

    Official

    Write tests, add test coverage, unit test, or add missing tests for Bitwarden iOS.

    696 GitHub stars~1.8k tokensUpdated today
    Testing & QAAuto-check passed
  • Caliber Testing

    caliber-ai-org/ai-setup

    Writes Vitest tests following project patterns: tests/ directories, vi.mock() for module mocking with vi.hoisted() for test-time factories, global LLM mock from src/test/setup.ts, environment…

    1.3k GitHub stars~3.2k tokensUpdated 15 days ago
    Testing & QAAuto-check passed
  • Test Coverage Review

    areed1192/finance-news-aggregator

    Audit, plan, write, and verify unit tests for Python projects using pytest.

    149 GitHub stars~2.6k tokensUpdated 5 mo ago
    Testing & QAAuto-check passed

More from aehrc/pathling

All 25 skills in this repo
  • Databricks CLI

    aehrc/pathling

    Expert guidance for using the Databricks CLI to manage Databricks workspaces, clusters, jobs, pipelines, Unity Catalog, SQL warehouses, serving endpoints, secrets, bundles, and all other Databricks…

    137 GitHub stars~2.1k tokensUpdated yesterday
    Auto-check passed
  • Fhir API

    aehrc/pathling

    Expert guidance for implementing FHIR RESTful API servers and clients following the HL7 FHIR specification.

    137 GitHub stars~1.5k tokensUpdated yesterday
    Auto-check passed
  • Fhir Bulk Data

    aehrc/pathling

    Expert guidance for implementing FHIR Bulk Data Access (Flat FHIR) following the HL7 specification.

    137 GitHub stars~1.8k tokensUpdated yesterday
    Auto-check passed
  • Fhir Search Spec

    aehrc/pathling

    FHIR RESTful search specification expert with access to the official HL7 search specification text and the formal SearchParameter registry.

    137 GitHub stars~649 tokensUpdated yesterday
    Auto-check passed
  • Hapi Fhir Server

    aehrc/pathling

    Expert guidance for implementing FHIR servers using HAPI FHIR Plain Server framework.

    137 GitHub stars~2.6k tokensUpdated yesterday
    Auto-check passed
  • Playwright Testing

    aehrc/pathling

    Expert guidance for writing end-to-end tests with Playwright Test framework.

    137 GitHub stars~1.5k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Fhirpath Test Designer

What does Fhirpath Test Designer do?

Design and generate comprehensive FHIRPath test suites using input domain partitioning and Pathling's DSL test framework. Fhirpath Test Designer is an agent skill from aehrc/pathling. Design and generate comprehensive FHIRPath test suites using input domain partitioning and Pathling's DSL test framework.

When should I use Fhirpath Test Designer?

Fhirpath Test Designer fits situations like: the user asks to write tests for a FHIRPath feature (function; type system behavior; traversal pattern; review existing test coverage.

How do I install Fhirpath Test Designer in Claude Code?

Run `npx skills add aehrc/pathling --skill fhirpath-test-designer -a claude-code`. Or copy the skill folder (.claude/skills/fhirpath-test-designer in aehrc/pathling) into .claude/skills/fhirpath-test-designer in your project. Claude Code loads it when a task matches its description.

How do I install Fhirpath Test Designer in Codex?

Run `npx skills add aehrc/pathling --skill fhirpath-test-designer -a codex`. Or copy the skill folder (.claude/skills/fhirpath-test-designer in aehrc/pathling) into .agents/skills/fhirpath-test-designer in your project. Codex loads it when a task matches its description.

Can I use Fhirpath Test Designer 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 aehrc/pathling --skill fhirpath-test-designer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fhirpath-test-designer, .gemini/skills/fhirpath-test-designer, .github/skills/fhirpath-test-designer and .opencode/skills/fhirpath-test-designer in your project.

What does Fhirpath Test Designer need to run?

Going by SKILL.md and its folder, Fhirpath Test Designer needs the command-line tools its instructions call (mvn).

Does Fhirpath Test Designer access the network?

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

Is Fhirpath Test Designer 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 Fhirpath Test Designer use?

Fhirpath Test Designer 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 Fhirpath Test Designer 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. Its references folder adds about 1.5k tokens, read only when the agent opens those files.

What are the alternatives to Fhirpath Test Designer?

Skills that share tags, products or a category with Fhirpath Test Designer: Senior QA (nicepkg/auto-company, 194 stars), OpenROAD Module Test Adder (The-OpenROAD-Project/OpenROAD, 3.2k stars), Find Untested Sources (dotnet/skills, 5.6k stars) and Testing iOS Code (bitwarden/ios, 696 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Fhirpath Test Designer?

aehrc (a GitHub organization) maintains it in aehrc/pathling, which has 137 GitHub stars. The repository holds 25 skills in this directory. The repository was last updated on October 8, 2026.

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