Emilkowal Animations
theexperiencecompany/gaia
Emil Kowalski's animation best practices for web interfaces.
QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac.
$ npx skills add imbue-ai/sculptor --skill auto-qa-iphone -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install imbue-ai/sculptor auto-qa-iphone --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/imbue-ai/sculptor.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/auto-qa-iphone .claude/skills/auto-qa-iphone && 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 "auto-qa-iphone" agent skill from https://github.com/imbue-ai/sculptor/tree/main/.claude/skills/auto-qa-iphone into .claude/skills/auto-qa-iphone/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "auto-qa-iphone", 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/imbue-ai/sculptor/tree/main/.claude/skills/auto-qa-iphoneType 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 imbue-ai/sculptor --skill auto-qa-iphone -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install imbue-ai/sculptor auto-qa-iphone --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/imbue-ai/sculptor.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/auto-qa-iphone .agents/skills/auto-qa-iphone && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "auto-qa-iphone" agent skill from https://github.com/imbue-ai/sculptor/tree/main/.claude/skills/auto-qa-iphone into .agents/skills/auto-qa-iphone/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "auto-qa-iphone", 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 imbue-ai/sculptor --skill auto-qa-iphone -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install imbue-ai/sculptor auto-qa-iphone --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/imbue-ai/sculptor.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/auto-qa-iphone .cursor/skills/auto-qa-iphone && 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 "auto-qa-iphone" agent skill from https://github.com/imbue-ai/sculptor/tree/main/.claude/skills/auto-qa-iphone into .cursor/skills/auto-qa-iphone/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "auto-qa-iphone", 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/imbue-ai/sculptor.git --path .claude/skills/auto-qa-iphone--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 imbue-ai/sculptor --skill auto-qa-iphone -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install imbue-ai/sculptor auto-qa-iphone --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/imbue-ai/sculptor.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/auto-qa-iphone .gemini/skills/auto-qa-iphone && 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 "auto-qa-iphone" agent skill from https://github.com/imbue-ai/sculptor/tree/main/.claude/skills/auto-qa-iphone into .gemini/skills/auto-qa-iphone/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "auto-qa-iphone", 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 imbue-ai/sculptor auto-qa-iphoneInstalls 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 imbue-ai/sculptor --skill auto-qa-iphone -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/imbue-ai/sculptor.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/auto-qa-iphone .github/skills/auto-qa-iphone && 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 "auto-qa-iphone" agent skill from https://github.com/imbue-ai/sculptor/tree/main/.claude/skills/auto-qa-iphone into .github/skills/auto-qa-iphone/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "auto-qa-iphone", 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 imbue-ai/sculptor --skill auto-qa-iphone -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install imbue-ai/sculptor auto-qa-iphone --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/imbue-ai/sculptor.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/auto-qa-iphone .opencode/skills/auto-qa-iphone && 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 "auto-qa-iphone" agent skill from https://github.com/imbue-ai/sculptor/tree/main/.claude/skills/auto-qa-iphone into .opencode/skills/auto-qa-iphone/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "auto-qa-iphone", 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.
auto-qa-iphoneQA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac.
Auto QA Iphone is an agent skill from imbue-ai/sculptor. QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac. A single CLI boots a notched iPhone, launches the local frontend server (parsing its port — no hardcoding), opens the app in MobileSafari, taps/swipes via idb, and screenshots each step. Includes the Add-to-Home-Screen standalone flow — the only way to verify notch / status-bar / home-indicator safe-area rendering (env(safe-area-inset-) is 0 everywhere except real iOS). Use when visually verifying mobile/responsive changes on an…
Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including scripts (for example `scripts/devices.py` and `scripts/iphone_sim.py`).
It sits in Frontend & Design, covering Frontend development. It works with iOS. The repository describes itself as: Build product with grounded, parallel coding agents. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit f847102. 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 3 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3justxcrunxcodebuildbrewFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Auto QA Iphone loads about 3.1k tokens when it runs. Until then it costs about 135 tokens; SKILL.md has 1,413 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 imbue-ai/sculptor at commit f847102, republished under its MIT licence (© imbue-ai). 1,413 words, ~3,139 tokens.
.claude/skills/auto-qa-iphone/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.This is the iPhone sibling of /auto-qa-changes. Instead of a headless Chromium
at desktop size, it drives a real iOS Simulator so you can see how the mobile
web UI actually renders on a notched iPhone — including the standalone PWA
chrome (the app sets apple-mobile-web-app-capable, viewport-fit=cover, and a
black-translucent status bar in sculptor/frontend/index.html).
Why a real simulator and not Playwright: env(safe-area-inset-*) — the insets
the mobile shell uses for the notch/Dynamic Island, status bar, and home
indicator — are 0 everywhere except a real iOS surface. Desktop browsers,
Playwright, and the /auto-qa-changes Chromium harness all report 0. The only
faithful check is Add-to-Home-Screen + a standalone launch on a notched device.
Everything is driven through one CLI:
.claude/skills/auto-qa-iphone/scripts/iphone_sim.pyStdlib-only Python (no uv/venv needed to run it); it shells out to
xcrun simctl, idb, and just.
setup checks for one and,
if missing, prints the (~9 GB) download command xcodebuild -downloadPlatform iOS
— it will not download automatically unless you pass --download-runtime.setup
creates an idb venv at ~/.cache/sculptor-iphone-qa/idb-venv and
brew install idb-companion for you.just rebuild once if this is a fresh checkout),
since the default server command is just frontend-custom.Set a short alias and a screenshots dir (defaults to the workspace
attachments/, so images render in chat and survive for MR reuse):
SIM=".claude/skills/auto-qa-iphone/scripts/iphone_sim.py"python3 "$SIM" setup # default device: iphone-16-pro (notched)
# Other presets: --device iphone-16-pro-max | iphone-se (non-notched control)This creates/reuses a SculptorQA-<preset> simulator, boots it, connects idb,
and prints the UDID. Re-running is safe (it reuses the device). To watch it
live: open -a Simulator.
Have your dev server running first (e.g. just frontend-custom or just start
in your own terminal — it works reliably there). Then:
python3 "$SIM" openHow open/serve resolve the URL (no port is ever hardcoded — the dev port is
hashed per checkout):
--url URL / --port N — attach to exactly that server.app build; it warns when it could only find the latter). This is the normal,
reliable path.--command (default
just frontend-custom), parse its port from the log, and verify it actually
serves before using it.The simulator shares the host network, so http://127.0.0.1:<port> is reachable.
Launching from inside a Sculptor agent is flaky.
just frontend-customdrives Electron, which (a) races to load its renderer before vite is ready and dies under--unhandled-rejections=strict, (b) refuses a second instance via the.dev_sculptorsingle-instance lock, and (c) inherits a leakedSCULPTOR_API_PORTfrom the surrounding session. Prefer keeping your own dev server running and lettingopenauto-detect it (or pass--port/--url). Use--launchto force the fallback launch anyway.
Every action prints a screenshot: path and an <img> tag — paste the tag
into chat to show the user (see "Context management").
python3 "$SIM" screenshot --label home # capture current screen
python3 "$SIM" tap --frac 0.5 0.93 # tap by screen fraction (0..1)
python3 "$SIM" swipe 201 620 201 320 # swipe by points
python3 "$SIM" describe # a11y tree of the foreground appSafari always shows its own chrome, so the standalone status bar and true safe-area insets only appear after adding to the home screen and launching.
First, make sure Safari's bottom toolbar is visible: if the page auto-focused an input, the on-screen keyboard hides the toolbar (and the Share button). Dismiss it by tapping an empty area, then screenshot to confirm the toolbar is back:
python3 "$SIM" tap --frac 0.5 0.42 # tap empty space to blur the inputThen drive the flow (it screenshots after every tap because SpringBoard and the share sheet aren't in the accessibility tree, so they can't be located):
python3 "$SIM" add-to-home-screen # Share -> swipe -> Add to Home Screen -> AddVerify each screenshot matches the expected step before trusting the next. Then launch the clip. The icon's position is not fixed, so locate it first and tap its artwork center (the text label sits ~40 pt below the artwork — aim at the glyph, not the label) via a describe-screenshot subagent, then:
python3 "$SIM" screenshot --label home # capture the home screen
# (locate the Sculptor icon ARTWORK center as a fraction, then:)
python3 "$SIM" launch-icon --frac 0.39 0.26 --settle 6If the home screen is still showing afterward, the tap missed the artwork — re-locate and tap again.
python3 "$SIM" teardown # stops the managed server + shuts the sim down
# python3 "$SIM" teardown --delete # also delete the simulator device| Command | What it does |
|---|---|
setup [--device P] [--download-runtime] | Ensure runtime + idb; create/boot SculptorQA-<P>; connect idb; print UDID. |
detect | List running Sculptor servers (tagged dev/app) and show which one open would attach to. |
serve [--port N | --url U | --command C | --launch] | Resolve a server URL: attach to --port/--url, else auto-detect a running one, else launch --command. |
open [--port N | --url U | --command C | --launch] | Same URL resolution as serve, then simctl openurl → screenshot. |
screenshot [--label NAME] | Capture the current screen to a numbered PNG. |
tap X Y [--frac] | idb ui tap. --frac treats X/Y as 0..1 fractions of the screen. Auto-screenshots. |
swipe X1 Y1 X2 Y2 [--frac] [--duration S] | idb ui swipe. Auto-screenshots. |
describe | idb ui describe-all — JSON a11y tree (foreground app only). |
add-to-home-screen | Drive the AHS flow with a screenshot after each tap. |
launch-icon [X Y] [--frac] | Tap the home-screen clip to launch standalone; screenshot. |
remove-home-screen | Guidance for removing the clip (iOS caches launch config at add-time). |
teardown [--delete] | Stop the managed server; shut down (and optionally delete) the device. |
status | Print the device/server/idb state (JSON). |
Shared options (after any subcommand): --screenshots-dir PATH, --settle SECONDS.
State (UDID, point size, server pid/url, screenshot counter) persists to
<screenshots-dir>/.iphone-sim-state.json, so commands chain without re-passing
the UDID.
Simulator screenshots are native-scale PNGs (iPhone 16 Pro is 3× → ~1206×2622),
each large. Never call the Read tool on a screenshot yourself — a few will
blow out your context. Same three rules as /auto-qa-changes:
Display to the user via the <img> tag the CLI prints. This is free for
your context — it renders on the user's side; no image data enters yours.
Verify state programmatically when you can. describe (a11y tree),
status, and the success/failure of each command tell you a lot without
pixel inspection.
When you genuinely need visual inspection (alignment, what text appeared, whether the status bar overlaps content), delegate to a subagent with a narrow question:
Agent(description="Describe screenshot",
prompt="Read /abs/path/0007_standalone.png. Focus on the top of the
screen: does any header content sit UNDER the status bar / notch,
or is there correct safe-area padding above it? 2-3 sentences.")The image stays in the subagent's context and is discarded when it returns.
Same as /auto-qa-changes. Every screenshot you take, you MUST:
<img> tag (absolute src, descriptive alt).describe/status, or via a
describe-screenshot subagent. Do not Read the PNG yourself.Format each step:
<img src="/abs/path/attachments/iphone-screenshots/0002_open.png" alt="Mobile workspace shell, Safari">
**Step 2: Mobile shell in Safari**
Single-column layout: header, chat stream, floating input, agent pager at the
bottom. Safari's own toolbar is visible (expected — standalone chrome only shows
after Add-to-Home-Screen). No obvious layout issues.
**Next:** add to home screen and launch standalone to check the real status bar.idb wants points.--frac. Spot the target in a screenshot, express it as a fraction
of the image (e.g. a button 90% down the screen → --frac 0.5 0.9), and the
CLI multiplies by the device's point size. This is robust across devices.describe; SpringBoard,
the share sheet, and the home screen do not — drive those by coordinate and
verify with the screenshot after every tap.add-to-home-screen + launch-icon to exercise apple-mobile-web-app-status-bar-style
and the real safe-area insets.index.html's
<head> (meta tags, theme-color, icon), remove and re-add the clip —
reloading isn't enough. See remove-home-screen.tap --frac. For other presets, drive AHS manually.env(safe-area-inset-*) is 0 on non-notched devices — --device iphone-se
is a deliberate "insets ≈ 0" control, not a notch test.just frontend-custom runs the vite dev
server: edit a .tsx/.scss and re-screenshot to see it. But a standalone
(home-screen) clip does not pick up <head> changes without a remove/re-add.http://127.0.0.1:<port> works
(unlike a physical device). No tunneling needed.teardown stops it. status shows whether it's alive.teardown stops the managed server and shuts the simulator down (keeping the
device for next time; --delete removes it).
NEVER delete screenshot files — they're referenced by <img> tags in the
user's chat history and may be attached to MRs. Leave them in the screenshots dir.
© imbue-ai, 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 3 other files (scripts) in .claude/skills/auto-qa-iphone of imbue-ai/sculptor.
Open the folder on GitHubat commit f847102
Auto QA Iphone 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 |
|---|---|---|---|---|---|---|
| Auto QA Iphone this skillimbue-ai/sculptor | 238 | — | ~3.1k | Automated safety check: Pass | MIT | |
| Emilkowal Animationstheexperiencecompany/gaia | 308 | 1 repos | ~2k | Automated safety check: Pass | Custom licence | |
| Asc Shots PipelineCamilleScholtz/swmpc | 239 | 4 repos | ~2.8k | Automated safety check: Pass | EUPL-1.2 | |
| AccessibilityGetStream/stream-chat-react-native | 1.2k | — | ~6.5k | Automated safety check: Pass | Custom licence | |
| iOS Hig Design Guidedavepoon/buildwithclaude | 3.6k | — | ~735 | Automated safety check: Pass | MIT | |
| Frontend UI StandardsMaxHan7/frontend-ui-standards-skill | 106 | — | ~2.4k | Automated safety check: Pass | MIT |
theexperiencecompany/gaia
Emil Kowalski's animation best practices for web interfaces.
CamilleScholtz/swmpc
Orchestrate iOS screenshot automation with xcodebuild/simctl for build-run, AXe for UI actions, JSON settings and plan files, Koubou-based framing (asc screenshots frame), and screenshot upload (asc…
GetStream/stream-chat-react-native
Maintain VoiceOver/TalkBack-focused accessibility in stream-chat-react-native.
davepoon/buildwithclaude
Build, update, and apply iOS design specifications using Apple Human Interface Guidelines (HIG) source data.
MaxHan7/frontend-ui-standards-skill
A skill your agent uses when implementing, refactoring, or reviewing frontend UI across SwiftUI, React, React Native, Flutter, web, or mobile apps.
davidortinau/maui-skills
Guide for making .NET MAUI apps accessible — screen reader support via SemanticProperties, heading levels, AutomationProperties visibility control, programmatic focus and announcements, and…
imbue-ai/sculptor
Compare React component render counts between origin/main and the current branch during a user-defined UI scenario (e.g.
imbue-ai/sculptor
Post a one-line PR announcement to a Slack channel, and mark it :merged: when the PR merges.
imbue-ai/sculptor
Run Claude programmatically against collections of files in the codebase.
imbue-ai/sculptor
Build or modify a Sculptor extension — a runtime ESM module loaded into the Sculptor UI.
imbue-ai/sculptor
Review a set of code changes against Sculptor's review categories and produce a markdown findings table.
imbue-ai/sculptor
Cut a new Sculptor release candidate from main: run just cut-release (which creates the release/sculptor-vX.Y.0 branch at X.Y.0rc1, pushes the tag that triggers the RC build, and opens a PR bumping…
Works with
Categories
QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac. Auto QA Iphone is an agent skill from imbue-ai/sculptor. QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac.
Auto QA Iphone fits situations like: visually verifying mobile/responsive changes on an iPhone; tasks that involve Frontend development.
Run `npx skills add imbue-ai/sculptor --skill auto-qa-iphone -a claude-code`. Or copy the skill folder (.claude/skills/auto-qa-iphone in imbue-ai/sculptor) into .claude/skills/auto-qa-iphone in your project. Claude Code loads it when a task matches its description.
Run `npx skills add imbue-ai/sculptor --skill auto-qa-iphone -a codex`. Or copy the skill folder (.claude/skills/auto-qa-iphone in imbue-ai/sculptor) into .agents/skills/auto-qa-iphone 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 imbue-ai/sculptor --skill auto-qa-iphone -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/auto-qa-iphone, .gemini/skills/auto-qa-iphone, .github/skills/auto-qa-iphone and .opencode/skills/auto-qa-iphone in your project.
Going by SKILL.md and its folder, Auto QA Iphone needs Python for the scripts in its folder and the command-line tools its instructions call (python3, just, xcrun, xcodebuild and brew). Our summary lists: Python 3.
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.
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.
Auto QA Iphone 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.1k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Auto QA Iphone: Emilkowal Animations (theexperiencecompany/gaia, 308 stars), Asc Shots Pipeline (CamilleScholtz/swmpc, 239 stars), Accessibility (GetStream/stream-chat-react-native, 1.2k stars) and iOS Hig Design Guide (davepoon/buildwithclaude, 3.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
imbue-ai (a GitHub organization) maintains it in imbue-ai/sculptor, which has 238 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 9, 2026.
Source: imbue-ai/sculptor on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.