| name | doc-ears |
| description | Create EARS (Easy Approach to Requirements Syntax) formal requirements - Layer 3 of the SDD flow, translating PRD features into atomic, testable WHEN-THE-SHALL-WITHIN statements. Use after BRD and PRD exist. Single-document authoring primitive; for end-to-end or batch generation the autopilot (`doc-ears-autopilot`) drives this skill. |
| metadata | {"tags":["sdd-workflow","layer-3-artifact"],"custom_fields":{"layer":3,"artifact_type":"EARS","skill_category":"core-workflow","upstream_artifacts":["PRD"],"downstream_artifacts":["BDD","ADR","SPEC","TDD","IPLAN"],"version":"0.24.0","framework_spec_version":"0.40.0","last_updated":"2026-05-23","adapts":["section_toggles","glossary"]}} |
doc-ears
Purpose
Create an EARS (Easy Approach to Requirements Syntax) document — Layer 3 of
the SDD flow. EARS formalizes BRD/PRD requirements into precise, atomic, testable
statements using WHEN-THE-SHALL-WITHIN syntax, ready for BDD translation.
Layer: 3 — a refinement step formalizing the Context (BRD) → Container (PRD)
transition; it has no C4 level of its own.
Upstream: PRD (Layer 2). (Upstream BRD lineage is reachable transitively
via the @-tag chain per the necessary-upstream contract.)
Downstream: BDD → ADR → SPEC → TDD → IPLAN → Code.
Each EARS statement must be testable (Given-When-Then derivable),
measurable (quantifiable constraints), traceable (@prd), and
atomic (one concept per statement).
When to Use
Use doc-ears when:
- PRD (Layer 2) exists and you need formal requirements (the upstream BRD is
reached transitively via the PRD's own
@brd tags).
- Translating product features into precise behavioral statements.
- Establishing event-driven, state-driven, optional/feature-gated, error-handling, or system-wide rules.
For end-to-end generation from a PRD, a prompt, or an IPLAN, use
../doc-ears-autopilot/SKILL.md.
Prerequisites
Before writing, read:
- Template (source of truth):
${CLAUDE_PLUGIN_ROOT}/framework/layers/03_EARS/EARS-TEMPLATE.yaml
- Layer README:
${CLAUDE_PLUGIN_ROOT}/framework/layers/03_EARS/README.md
- ID & tag standards:
${CLAUDE_PLUGIN_ROOT}/framework/governance/ID_NAMING_STANDARDS.md
- Authoring style:
${CLAUDE_PLUGIN_ROOT}/framework/governance/AUTHORING_STYLE.md
- Upstream PRD that drives this EARS (and, via the PRD's own
@brd
tags, the BRD it derives from).
Confirm no ID collision: ls docs/03_EARS/ 2>/dev/null. Reference only upstream
documents that exist; never invent placeholders like PRD-XXX or TBD.
Layer Guidance
Required structure (5 numbered sections + glossary backmatter)
document_control is Section 1 (status, version, dates YYYY-MM-DD,
priority, single @prd: source, BDD-Ready score, revision-history table).
Then:
- Purpose & Context · 3. Requirements (the five patterns) · 4. Quality
Attributes (tabular) · 5. Traceability.
Plus a Glossary backmatter section (glossary: template key — required,
unnumbered). Section numbers and identifiers come from EARS-TEMPLATE.yaml's
own # Section N: numbering — the template is the source of truth.
See EARS-TEMPLATE.yaml for per-section content and embedded authoring guidance.
The five EARS patterns (Section 3)
| Pattern | Syntax | Use for |
|---|
| Event-Driven | WHEN [trigger], THE [component] SHALL [action] WITHIN [timing]. | user/API/timer events |
| State-Driven | WHILE [state], THE [component] SHALL [behavior] WITHIN [context]. | continuous / mode-dependent behavior |
| Optional | WHERE [feature enabled], THE [component] SHALL [behavior]. | feature-flagged / config-gated behavior |
| Unwanted | IF [error], THE [component] SHALL [recovery] WITHIN [timing]. | failures, edge cases, fallbacks |
| Ubiquitous | THE [component] SHALL [behavior] for [scope]. | global invariants, logging, audit |
A genuinely multi-condition requirement composes these (e.g.
WHILE [state], WHEN [event], THE … SHALL …) — composition, not a sixth pattern.
EARS uses THE … SHALL … as the response clause, never a THEN connective.
Each requirement is atomic (one testable concept) and carries an element ID
plus a per-requirement @prd: … traceability line. Use the Boundary Value
Matrix, State Transition (with error states), and Fallback Path
patterns from the template where they apply.
Quantifiable language (Sections 3 / 4)
Use SHALL / SHALL NOT / SHOULD / MAY correctly. Replace vague latency
with percentiles: real-time → p50<100ms/p95<300ms/p99<1000ms; immediately →
<500ms; fast/quickly → exact latency. Section 4 (Quality Attributes:
Performance, Security, Reliability) is tabular with measurable targets:
latency/response-time uses p50/p95/p99 notation, while a non-latency
bound (cycle/iteration counts, event-windows, batch sizes, *.count) is
quantified by a concrete value + unit (percentiles do not apply). Carry
changeable values as @threshold: PRD.NN.category.key tags (no PRD section
numbers in the tag).
Element IDs and tags
- Hierarchical element IDs:
EARS.{doc_id}.{section_id}.{hash} (e.g.
EARS.01.03.c4d8; Requirements = section 03, Quality Attributes = section
04). Emit a stable 4-hex-char identifier per element, distinct within its section (HASH01); extend to 8 on collision. Do not compute SHA-256 in this prompt — the hash form is the canonicalization TARGET produced by a deterministic tool pass, and byte-exact field extraction is defined for BRD §7 only (Phase 2+ for EARS). Authority: framework/governance/ID_NAMING_STANDARDS.md.
- EARS is Layer 3, so it carries the required
@prd upstream tag (per the
necessary-upstream contract). One @prd: only in Document Control (extras go
in per-requirement tags); no ranges. Upstream BRD lineage is reachable
transitively via the PRD's own @brd tags — do not emit @brd: on EARS
elements.
- Removed patterns (do not use):
Event-XXX, State-XXX, UB-XXX,
REQ-XXX; legacy 3-segment EARS.NN.xxxx; numeric type-code EARS.NN.25.SS;
dash form EARS-NN-XXX.
Creation Process
- Read upstream — the PRD that drives these requirements (and, via its
@brd tags, the BRD it derives from).
- Reserve ID — next free
EARS-NN (two digits: EARS-01, EARS-99,
EARS-102).
Per-layer independence (CLEANUP-PR-F item 18): pick the next-free
number in YOUR layer's index — the upstream's number is NOT your number
(doc numbers are per-layer sequential and independent; see
framework/governance/ID_NAMING_STANDARDS.md §Cross-layer cardinality).
- Create the nested folder — every EARS lives in
docs/03_EARS/EARS-NN_{slug}/ regardless of size. Monolithic:
EARS-NN_{slug}.md inside it; section-based (>25 KB): EARS-NN.S_{section}.md
- index from
${CLAUDE_PLUGIN_ROOT}/framework/layers/03_EARS/EARS-00_index.TEMPLATE.md.
- Document Control (Section 1) first, then complete §2–§5 plus the
glossary backmatter from the template.
- Categorize requirements into the five patterns; write atomic
THE … SHALL … statements (WITHIN timing where applicable) with
@threshold: constraints.
- Fill Quality Attributes (tabular; latency → percentiles, non-latency bounds → value + unit) and Traceability
(
@prd per the necessary-upstream contract).
- Update the EARS index
docs/03_EARS/EARS-00_index.md in the same change.
- Validate (below) and commit the EARS and index together.
Validation
This skill is the validator (no runtime code). Apply against ${CLAUDE_PLUGIN_ROOT}/framework/layers/03_EARS/README.md and ${CLAUDE_PLUGIN_ROOT}/framework/governance/ID_NAMING_STANDARDS.md.
Error codes (all severity error): XDOC-006 tag format invalid · XDOC-008 broken internal link · XDOC-009 missing traceability section.
Quality gate (blocking): BDD-Ready score ≥ 90/100 before moving on. If issues
are found, fix and re-check; if unfixable, log for manual review.
Next Skill
../doc-bdd/SKILL.md — the BDD references this EARS (@ears: EARS.NN.SS.xxxx)
and turns each statement into executable Given-When-Then scenarios. (BDD's
required upstream is @ears only; further upstream lineage is reachable
transitively via the @-tag chain.)
Adaptation
Read .aidoc/profile.yaml; honor only this skill's knobs
(section_toggles, glossary). Ignore unknown keys; absent a profile, use
framework defaults. Authority:
${CLAUDE_PLUGIN_ROOT}/framework/governance/ADAPTATION.md.
Related Resources
- Template / authoring rules:
${CLAUDE_PLUGIN_ROOT}/framework/layers/03_EARS/EARS-TEMPLATE.yaml
- Layer README:
${CLAUDE_PLUGIN_ROOT}/framework/layers/03_EARS/README.md
- Index template:
${CLAUDE_PLUGIN_ROOT}/framework/layers/03_EARS/EARS-00_index.TEMPLATE.md
- ID & tag standards:
${CLAUDE_PLUGIN_ROOT}/framework/governance/ID_NAMING_STANDARDS.md
- Quality gate:
../doc-ears-audit/SKILL.md · Fixes: ../doc-ears-fixer/SKILL.md
- Generation pipeline:
../doc-ears-autopilot/SKILL.md
- Diagrams (state/sequence):
../charts-flow/SKILL.md
Quick Reference
| |
|---|
| Purpose | Formalize requirements with WHEN-THE-SHALL-WITHIN syntax |
| Layer | 3 (refinement; no C4 level) |
| Upstream tags | @prd (per necessary-upstream contract) |
| Key rule | One atomic, testable, quantifiable statement each |
| Must include | Document Control (first), five patterns, 5 sections |
| Quality gate | BDD-Ready ≥ 90/100 |
| Next | doc-bdd |