CCPM Project Management
automazeio/ccpm
Runs a spec-driven workflow from PRD to epic to GitHub issues to parallel agents, with status, standup and blocked-work reports from bundled scripts.
Run the speckit implementation phase chunk-by-chunk in clean-context subagents, then review, then produce a final report.
$ npx skills add opsmill/infrahub --skill speckit-opsmill-implement -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install opsmill/infrahub speckit-opsmill-implement --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/opsmill/infrahub.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/speckit-opsmill-implement .claude/skills/speckit-opsmill-implement && 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 "speckit-opsmill-implement" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/speckit-opsmill-implement into .claude/skills/speckit-opsmill-implement/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "speckit-opsmill-implement", 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/opsmill/infrahub/tree/stable/.agents/skills/speckit-opsmill-implementType 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 opsmill/infrahub --skill speckit-opsmill-implement -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install opsmill/infrahub speckit-opsmill-implement --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/speckit-opsmill-implement .agents/skills/speckit-opsmill-implement && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "speckit-opsmill-implement" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/speckit-opsmill-implement into .agents/skills/speckit-opsmill-implement/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "speckit-opsmill-implement", 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 opsmill/infrahub --skill speckit-opsmill-implement -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install opsmill/infrahub speckit-opsmill-implement --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/speckit-opsmill-implement .cursor/skills/speckit-opsmill-implement && 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 "speckit-opsmill-implement" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/speckit-opsmill-implement into .cursor/skills/speckit-opsmill-implement/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "speckit-opsmill-implement", 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/opsmill/infrahub.git --path .agents/skills/speckit-opsmill-implement--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 opsmill/infrahub --skill speckit-opsmill-implement -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install opsmill/infrahub speckit-opsmill-implement --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/speckit-opsmill-implement .gemini/skills/speckit-opsmill-implement && 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 "speckit-opsmill-implement" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/speckit-opsmill-implement into .gemini/skills/speckit-opsmill-implement/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "speckit-opsmill-implement", 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 opsmill/infrahub speckit-opsmill-implementInstalls 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 opsmill/infrahub --skill speckit-opsmill-implement -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/speckit-opsmill-implement .github/skills/speckit-opsmill-implement && 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 "speckit-opsmill-implement" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/speckit-opsmill-implement into .github/skills/speckit-opsmill-implement/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "speckit-opsmill-implement", 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 opsmill/infrahub --skill speckit-opsmill-implement -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install opsmill/infrahub speckit-opsmill-implement --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/speckit-opsmill-implement .opencode/skills/speckit-opsmill-implement && 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 "speckit-opsmill-implement" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/speckit-opsmill-implement into .opencode/skills/speckit-opsmill-implement/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "speckit-opsmill-implement", 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.
speckit-opsmill-implementRun the speckit implementation phase chunk-by-chunk in clean-context subagents, then review, then produce a final report.
Speckit Opsmill Implement is an agent skill from opsmill/infrahub. Run the speckit implementation phase chunk-by-chunk in clean-context subagents, then review, then produce a final report. Picks up from an existing tasks.md.
Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts. Compatibility notes: Requires spec-kit project structure with .specify/ directory
It sits in Development, covering Spec-driven development and Subagents. The repository describes itself as: Infrahub is a graph-based data management platform with built-in version control, CI workflows, peer review, and API access. It’s purpose-built to power reliable infrastructure… The licence is Apache-2.0.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit af1c6c8. 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.
Shell commands in SKILL.md call:
gocargonpmmakeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.
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.
Requires spec-kit project structure with .specify/ directory
From compatibility in the SKILL.md frontmatter.
Speckit Opsmill Implement loads about 3.5k tokens when it runs. Until then it costs about 46 tokens; SKILL.md has 2,024 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); files beside SKILL.md are not scanned.
The full file from opsmill/infrahub at commit af1c6c8, republished under its Apache-2.0 licence (© opsmill). 2,024 words, ~3,527 tokens.
.claude/skills/speckit-opsmill-implement/SKILL.md (or your agent's skills folder).$ARGUMENTSYou MUST consider the user input before proceeding (if not empty). $ARGUMENTS is optional and may name the spec directory to operate on (e.g. specs/008-foo). If empty, operate on the most recently modified spec directory under specs/ that has a tasks.md.
You are running the implementation + review tail of the speckit pipeline. This command picks up where speckit-opsmill-prep leaves off: it expects a feature directory under specs/ containing spec.md, plan.md, and tasks.md. It does not generate or modify those documents — it executes them.
The implementation phase runs as a loop over chunks of tasks.md, with each chunk implemented inside a clean-context subagent. The orchestrator (you) never edits feature code directly — it dispatches, integrates, and reports.
After all chunks are complete, you run a single review pass across the whole change set, fix any high-severity findings, and emit a final report.
Each phase below is executed by invoking the named skill (e.g. via the agent's Skill tool). Skills are agent-agnostic, so this workflow runs identically across any harness that supports skill discovery — not only those exposing speckit slash commands.
Invocation context. This command runs in one of two modes, and the stop-conditions below behave differently in each:
speckit-opsmill-auto). There is no user to resume a pause, so you MUST NOT pause or wait. Treat every stop-condition below as a hard abort: do not start the implement loop, and end your run with the STATUS: BLOCKED status line defined in Completion so the parent orchestrator can detect it and stop cleanly. Never proceed on a dirty tree or missing docs — doing so contaminates the HEAD@start..HEAD@now review diff. You can tell you are running under an autonomous parent because you were dispatched with a resolved spec-dir path and no interactive session.Before any work begins:
$ARGUMENTS or the most recently modified specs/<feature>/ with a tasks.md). Record the absolute path; you will pass this to every subagent.spec.md, plan.md, and tasks.md all exist. If any are missing: interactive → abort with a clear error directing the user to run speckit.opsmill.prep first; autonomous parent → abort with STATUS: BLOCKED (reason: missing prep artifacts).tasks.md end-to-end and identify the chunking boundaries (see "Chunking strategy" below). Build a numbered list of chunks with their task IDs.STATUS: BLOCKED (reason: unexpectedly dirty working tree). Do not attempt to stash or clean it yourself.HEAD commit — you will diff against it for the review and report.Phase numbering. This file is the implementation tail; phases jump 0 → 5 → 6 → 7 on purpose. Phases 1–4 (Specify → Plan → Critique → Tasks) run in
speckit-opsmill-prep. They are not missing or skipped here.
Loop over the chunks identified in Phase 0. For each chunk:
Dispatch a subagent with a clean context. Use your harness's subagent / Task tool (in Claude Code: the Agent tool with subagent_type=general-purpose). The subagent must not inherit the orchestrator's conversation history — every chunk starts fresh.
Brief the subagent self-contained. The orchestrator has read context the subagent does not. The prompt to the subagent must include:
AGENTS.md, CLAUDE.md, CONTEXT.md, and the project constitution (commonly .specify/memory/constitution.md, dev/constitution.md, or constitution.md). The orchestrator should resolve which of these actually exist before dispatch and pass the resolved absolute paths — do not ask the subagent to guess. If none exist, say so explicitly so the subagent does not waste a turn searching.tasks.md (task IDs, descriptions, and any [P] parallel markers).speckit-implement skill scoped to only those task IDs — not the full tasks.md.speckit-checkpoint-commit skill before returning.⚠️ partial or ❌ blocked (not ✅ done) with the reason.AGENTS.md / CLAUDE.md, then the repo's standard locations (Makefile, package.json scripts, pyproject.toml, Cargo.toml, go.mod, CI config, tasks.md itself). Use whatever runner the project actually uses — pytest, go test, cargo test, npm test, vitest, make test, etc. Do not assume a specific framework.n/a if the runner needs none — and the verbatim pass line from the runner's output (e.g. PASSED ..., ok, --- PASS:, ✓ ...). If the chunk added or modified no tests, the subagent MUST say so explicitly so the orchestrator can record "n/a" rather than an omission. If an E2E test was added but not run locally because the project does not support local E2E execution, the subagent MUST state that as a separate line and include any CI-side runbook / command that will exercise it instead.Wait for the subagent to return, then:
tasks.md checkboxes for that chunk are now [X] (re-read the file). If the subagent forgot to tick them, do it yourself and add a fresh fixup commit — do not --amend the subagent's commit. Its SHA is already recorded in the Phase 7 chunk ledger (§2) and may be referenced elsewhere; amending would rewrite it and make the final report cite a commit that no longer exists.speckit-checkpoint-commit again here — the subagent already committed. Only commit yourself if you applied a fixup (e.g. ticking missed checkboxes).Move to the next chunk. Never run two implementation subagents in parallel — chunks may share files and conflicting writes are far more expensive than the wall-clock savings.
Prefer the natural phase headings already present in tasks.md (### Phase 3.1: Setup, ### Phase 3.2: Tests First (TDD), ### Phase 3.3: Core Implementation, etc.). Each phase becomes one chunk.
If a phase contains more than ~10 tasks or touches > ~15 files, split it further along cohesive seams (e.g. one chunk per module, one chunk per contract test). If two adjacent small phases together total < ~5 tasks, do not merge them — keep the boundary; small chunks help review and reduce blast radius if a subagent goes off the rails.
Respect explicit dependencies in tasks.md. Sequential [P]-free tasks must stay in their original order across chunks; [P] markers within a chunk are fine for the subagent to parallelise internally.
Once all chunks have completed (including any retries), invoke the speckit-review-run skill once across the full diff (HEAD-at-start..HEAD-now).
speckit-checkpoint-commit.Write a markdown report to <spec-dir>/opsmill-implement-report.md and also print it to the user. The report must contain:
Header — feature name, spec dir, base commit, head commit, total wall-clock time if known.
Chunk-by-chunk ledger — for each chunk dispatched, in order:
tasks.md).Tasks not completed — task IDs still [ ] in tasks.md, with the reason from the relevant subagent's report. Empty section if everything is [X].
Local-pass evidence (REQUIRED). A table of every test added or modified by this run — unit, integration, and E2E — with one row per test:
| Test id | Type (unit/integration/e2e) | Run command | Passed at (ISO 8601) | Environment context | Verbatim pass line |
|---|
Aggregate the rows from each chunk subagent's response. If a chunk added/modified a test but did not return evidence, the row's "Passed at" cell MUST be MISSING — see chunk <N> and the test MUST also appear in §3 "Tasks not completed" as a blocker — never silently elide it.
If an E2E test was added but not executable locally in this project, record it as a separate row with Passed at = deferred — local E2E not supported and put the CI-side command in Run command. Call this out in §6 "Autonomous decisions" so the user can confirm the call.
If no tests were added or modified by the whole run, write n/a — no new or modified tests in this implementation instead of the table and state it explicitly so reviewers can verify the claim against the diff.
Review findings — table of severity / file / one-line summary. Mark which were fixed inline and which were deferred.
Autonomous decisions — any judgment calls the orchestrator made that the user might want to revisit (chunk splits, blocked-task handling, review-finding triage choices).
Suggested next steps — e.g. "open a PR", "rerun speckit.opsmill.implement to retry the 2 blocked tasks", "address the deferred review findings".
Blocking rule. If §4 contains any MISSING row, the report header MUST mark the run INCOMPLETE and §7 MUST list "produce local-pass evidence for the listed tests" as the first next step. Do not declare the spec done while local-pass evidence is missing. (deferred — local E2E not supported rows do NOT trigger this rule, but they MUST be flagged in §6.)
Commit the report via speckit-checkpoint-commit as the final action.
Print a 4-6 line summary mirroring the report header + outcome counts so the user does not need to open the file to know the result.
Machine-readable status line (REQUIRED). The final line of your output MUST be exactly:
STATUS: <DONE|INCOMPLETE|BLOCKED> | SPEC_DIR: <absolute spec-dir path> | REASON: <short reason or n/a>
STATUS: DONE — all chunks completed and §4 local-pass evidence has no MISSING rows.STATUS: INCOMPLETE — the run finished but the report is marked INCOMPLETE (e.g. missing local-pass evidence, or blocked tasks recorded).STATUS: BLOCKED — a Phase 0 stop-condition aborted the run before the implement loop (missing prep artifacts, unexpectedly dirty tree). In this case no report is written; emit only the summary explaining why, then this line.The parent speckit-opsmill-auto parses this line; keep it as the literal last line, unwrapped.
Then stop — do not open a PR, do not push, do not start a new feature. The user will take it from there.
© opsmill, 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
Just SKILL.md in .agents/skills/speckit-opsmill-implement of opsmill/infrahub.
Open the folder on GitHubat commit af1c6c8
Speckit Opsmill Implement 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 |
|---|---|---|---|---|---|---|
| Speckit Opsmill Implement this skillopsmill/infrahub | 529 | — | ~3.5k | Automated safety check: Pass | Apache-2.0 | |
| CCPM Project Managementautomazeio/ccpm | 8.4k | — | ~1.1k | Automated safety check: Pass | MIT | |
| MoAI Foundation Coremodu-ai/moai-adk | 1.2k | — | ~5k | Automated safety check: Pass | Apache-2.0 | |
| Spec-Driven Development v2LichAmnesia/lich-skills | 234 | — | ~3.1k | Automated safety check: Pass | MIT | |
| Sagawarpdotdev/common-skills | 606 | — | ~4.1k | Automated safety check: Pass | MIT | |
| Tapd Story ImplementTencentBlueKing/bk-bcs | 840 | — | ~1.2k | Automated safety check: Pass | Custom licence |
automazeio/ccpm
Runs a spec-driven workflow from PRD to epic to GitHub issues to parallel agents, with status, standup and blocked-work reports from bundled scripts.
modu-ai/moai-adk
Reference for MoAI-ADK's core development principles: TRUST 5 quality gates, SPEC-first domain-driven workflow, agent delegation and token budgeting.
LichAmnesia/lich-skills
Organizes long-running agent work into a Project, Sprint and Task hierarchy with per-task state files, isolated worktrees, review loops and script-checked rules.
warpdotdev/common-skills
Run an autonomous, spec-driven development "saga" for medium-to-large features using an orchestrator agent and a fleet of worker subagents.
TencentBlueKing/bk-bcs
迭代执行流水线代码实现阶段。基于 tasks.md 调用 /speckit.implement 以 TDD 模式完成全部任务。
TencentBlueKing/bk-bcs
迭代执行流水线开发计划阶段。基于 spec.md 调用 /speckit.plan 以测试驱动开发模式构建 开发计划、技术调研与数据模型,并在同一 subagent 内就地做文档级合规自检,产出 plan-report.md。
opsmill/infrahub
Analyzes recent CI failures on pull requests to identify flaky tests, using retry outcomes (failed attempt → green re-run) and cross-PR recurrence as evidence, and maintains a local longitudinal…
opsmill/infrahub
Audits internal (dev/) and external (docs/) documentation completeness for a feature, subject, or set of existing docs, maps changes indicated by the user, across Infrahub's documentation layers…
opsmill/infrahub
Stages and commits the current changes onto a safe working branch, enforcing branch discipline and optionally pushing upstream.
opsmill/infrahub
A skill your agent uses when you've fixed a bug, added a feature, or made any user-facing change in a project that uses Towncrier and need to record it for the changelog — before committing or…
opsmill/infrahub
Turns a single feature idea, improvement, or bug into ONE well-structured GitHub issue.
opsmill/infrahub
Synthesises the current conversation context into a Product Requirements Document and publishes it to GitHub (as a comment on a referenced issue, or a new issue).
Categories
Run the speckit implementation phase chunk-by-chunk in clean-context subagents, then review, then produce a final report. Speckit Opsmill Implement is an agent skill from opsmill/infrahub. Run the speckit implementation phase chunk-by-chunk in clean-context subagents, then review, then produce a final report.
Speckit Opsmill Implement fits situations like: tasks that involve Spec-driven development; tasks that involve Subagents.
Run `npx skills add opsmill/infrahub --skill speckit-opsmill-implement -a claude-code`. Or copy the skill folder (.agents/skills/speckit-opsmill-implement in opsmill/infrahub) into .claude/skills/speckit-opsmill-implement in your project. Claude Code loads it when a task matches its description.
Run `npx skills add opsmill/infrahub --skill speckit-opsmill-implement -a codex`. Or copy the skill folder (.agents/skills/speckit-opsmill-implement in opsmill/infrahub) into .agents/skills/speckit-opsmill-implement 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 opsmill/infrahub --skill speckit-opsmill-implement -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/speckit-opsmill-implement, .gemini/skills/speckit-opsmill-implement, .github/skills/speckit-opsmill-implement and .opencode/skills/speckit-opsmill-implement in your project.
Going by SKILL.md and its folder, Speckit Opsmill Implement needs the command-line tools its instructions call (go, cargo, npm and make). Compatibility (from SKILL.md): Requires spec-kit project structure with .specify/ directory.
SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. 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. Review the folder before installing.
Speckit Opsmill Implement 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.
About 3.5k 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.
Skills that share tags, products or a category with Speckit Opsmill Implement: CCPM Project Management (automazeio/ccpm, 8.4k stars), MoAI Foundation Core (modu-ai/moai-adk, 1.2k stars), Spec-Driven Development v2 (LichAmnesia/lich-skills, 234 stars) and Saga (warpdotdev/common-skills, 606 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
opsmill (a GitHub organization) maintains it in opsmill/infrahub, which has 529 GitHub stars. The repository holds 32 skills in this directory. The repository was last updated on October 7, 2026.
Source: opsmill/infrahub on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.