Feature Decision Records (FDRs)
Manage product or project features as structured markdown documents. By default, FDRs live in docs/fdr/, but follow the repository's existing documentation layout if it already uses a different path.
Each FDR captures what a feature does from a user perspective and the design decisions that shaped it, with rationale.
What an FDR Is
An FDR is a single source of truth for one feature. It answers:
- What does the feature do, behaviorally? No implementation details.
- Why is it built this way? The design decisions, with rationale.
- Where does it fit? Related ADRs, related FDRs, and gates such as permissions, roles, plans, feature flags, or rollout rules.
FDRs sit alongside ADRs. The split:
- ADRs are about architectural decisions: cross-cutting choices like "event-driven integrations" or "tenant-scoped authorization". Often immutable once decided.
- FDRs are about features: what they do and the design decisions specific to that feature. Updated as the feature evolves.
A single feature may cite several ADRs; a single ADR may underpin several FDRs. That's fine and expected.
What an FDR Is NOT
- NOT a code walkthrough. No function signatures, no wire-format dumps, no database schema dumps, no queue/topic names, no low-level storage keys.
- NOT a file index. No "Key Files" tables.
- NOT an implementation guide. Agents can search the codebase for implementation details.
- NOT a changelog. Old design decisions that have been superseded should be rewritten, not appended. The FDR describes the feature today.
If you're writing API handler details, framework internals, type definitions, or code snippets in an FDR, you're going too deep. Stop and pull back to behavior and rationale.
Directory Structure
Default layout:
docs/fdr/
|-- INDEX.md # Index with TOC (read this first)
|-- FDR-001-roles-and-permissions.md # Individual FDR
|-- FDR-002-export-history.md
`-- ...
If a repository already has a feature-decision directory, use that instead. If no FDR directory exists, prefer docs/fdr/ unless the user asks for a different location.
File Naming
FDR-{NNN}-{kebab-case-slug}.md
NNN: Zero-padded three-digit number, sequential.
- Slug: Short kebab-case summary, not the full title.
FDR Template
# FDR-{NNN}: {Feature Name}
**Status:** Active
**Last reviewed:** {YYYY-MM-DD}
## Overview
One paragraph: what the feature is, who uses it, and why it exists.
## Behavior
Bullet points describing user-visible behavior. No implementation details.
## Design Decisions
Numbered list. Each entry calls out a non-obvious choice and why.
### 1. {Short decision title}
**Decision:** What we chose.
**Why:** The reasoning. Cite an ADR if there is one.
**Tradeoff:** What this costs us.
## Gates
Capabilities, roles, permission strings, feature flags, plan tiers, rollout rules, or other conditions that gate this feature, with one-line descriptions.
Omit this section for features that aren't gated.
## Related
- **ADRs:** ADR-XYZ, ADR-ABC
- **FDRs:** FDR-NNN
## Open Questions
Optional. Known design gaps, future considerations, or things we
deliberately haven't decided yet. Delete this section if there's
nothing to say.
Status values
- Active: feature is in the codebase and supported.
- Experimental: feature is in the codebase but unstable.
- Planned: feature has an accepted design but is not fully shipped yet.
- Retired: feature was removed but the FDR is kept to document the prior design. This should be rare; usually delete instead.
Workflow
Before doing anything
- Read relevant project instructions first. Check for repository guidance such as
AGENTS.md, CLAUDE.md, .agents/, .codex/, or documentation notes that mention FDRs, ADRs, permissions, roles, feature flags, plans, or product documentation.
- Locate the FDR directory. Check for
docs/fdr/INDEX.md first, then search for FDR-*.md if needed.
- Read the FDR index to see the current list of records.
- Only read individual FDR files if relevant to the current task.
- If ADRs are referenced, locate the repository's ADR index before resolving citations.
- Identify project-specific gate sources before validating gates. Search for permission, role, plan, entitlement, feature-flag, rollout, or capability registries in the current repository instead of assuming a fixed file path.
Creating a new FDR
- Read the FDR index to determine the next available number.
- Use the template above; fill in every required section.
- Set Last reviewed to today's date.
- Add the new entry to the FDR index.
- Cross-reference: if the FDR cites an ADR, the ADR doesn't need to be updated. Citations flow one direction: FDR to ADR.
- Sibling check: for each ADR you cite, skim other FDRs that already cite the same ADR. They're likely related to yours and worth listing in your
Related -> FDRs line.
- If no FDR structure exists yet, confirm the directory, numbering scheme, and initial scope with the user before creating files.
Updating an FDR
- Read the FDR.
- Make targeted edits. Don't append "Update: ..." notes; rewrite the affected section so the doc describes the feature today.
- Bump Last reviewed to today's date.
- If the title changed, update the FDR index.
- If related FDRs become stale because of the change, update their
Related entries too.
Retiring an FDR
When a feature is removed:
- Default: Delete the FDR. Remove the entry from the index. Git history preserves it if anyone needs to look back.
- Exception: Set status to
Retired and keep it only if the prior design is notable and likely to inform future work, such as a system that was deliberately rolled back and might be reconsidered. Add a top-level note explaining why it was retired.
Writing Style
- Behavior section: bullet points, short paragraphs. No code blocks. Describe what users see and experience.
- Design Decisions: numbered, with explicit Why and Tradeoff. Each entry should be defensible to a future maintainer who didn't live through the original conversation.
- Mention gates that shape the feature. Permissions, roles, plan tiers, feature flags, or rollout constraints are part of feature design. Don't describe how the checks are implemented.
- Cite ADRs by number when a design decision is downstream of an architectural choice. Don't restate the ADR; just point to it.
- Omit sections that don't add value. A simple feature might just need Overview and Behavior. Don't pad.
- Prefer stable product language over implementation language. Use user roles and visible outcomes, not class names, package names, or request/response shapes.
- Rewrite stale content in place. Avoid "Previously..." sections unless the prior behavior is still needed to explain compatibility or migration.
How To Run
Mode 1: Audit All FDRs (default)
When invoked without arguments, audit every FDR in the FDR directory against the codebase.
Mode 2: Audit One FDR
When invoked with a slug, title fragment, or FDR number, audit only that FDR.
Mode 3: Create a New FDR
When invoked with new <feature-slug> such as new export-history, research the feature and draft a new FDR. Always ask the user to confirm the slug, number, and scope before writing.
Audit Process
For each FDR being audited:
- Read the FDR in full.
- Verify each claim against the codebase and adjacent documentation:
- Gates: do the referenced permissions, roles, plan tiers, feature flags, or rollout conditions exist in the codebase, configuration, or product documentation?
- Gate sources: did you first identify the repository's actual registries or conventions for these gates?
- Behavioral claims: does the code actually work this way?
- Design decisions: are the stated rationales still accurate? Has the implementation drifted?
- Related ADRs/FDRs: do the cited records still exist and still apply?
- Return a structured report with:
- Verified: claims confirmed by code or documentation.
- Discrepancies: claims that contradict the implementation.
- Stale claims: behaviors or decisions that no longer apply.
- Missing: significant user-facing behavior the FDR doesn't mention.
When auditing multiple FDRs and subagents are available, run audits in parallel. If subagents are not available, audit sequentially and keep notes per FDR.
After Auditing
- Present a summary: which FDRs are clean, which need updates.
- For each discrepancy, propose a concrete edit.
- Only apply updates with user approval unless the user explicitly asked you to update the FDRs.
- If docs were added, removed, renumbered, or retitled, update the FDR index.
Verification Checklist
When auditing or creating an FDR, verify:
TOC Format
The FDR index should use a markdown table:
| # | Feature | Status | Last reviewed |
|---|---------|--------|---------------|
| [FDR-001](FDR-001-slug.md) | Title of the feature | Active | 2026-05-19 |
1---2name: fdr3description: Keep track of product or project features as Feature Decision Records (FDRs): one structured document per feature capturing behavior, design decisions, and rationale.4---56# Feature Decision Records (FDRs)78Manage product or project features as structured markdown documents. By default, FDRs live in `docs/fdr/`, but follow the repository's existing documentation layout if it already uses a different path.910Each FDR captures what a feature does from a user perspective and the design decisions that shaped it, with rationale.1112## What an FDR Is1314An FDR is a single source of truth for one feature. It answers:1516- **What** does the feature do, behaviorally? No implementation details.17- **Why** is it built this way? The design decisions, with rationale.18- **Where** does it fit? Related ADRs, related FDRs, and gates such as permissions, roles, plans, feature flags, or rollout rules.1920FDRs sit alongside ADRs. The split:2122- **ADRs** are about architectural decisions: cross-cutting choices like "event-driven integrations" or "tenant-scoped authorization". Often immutable once decided.23- **FDRs** are about features: what they do and the design decisions specific to that feature. Updated as the feature evolves.2425A single feature may cite several ADRs; a single ADR may underpin several FDRs. That's fine and expected.2627## What an FDR Is NOT2829- **NOT** a code walkthrough. No function signatures, no wire-format dumps, no database schema dumps, no queue/topic names, no low-level storage keys.30- **NOT** a file index. No "Key Files" tables.31- **NOT** an implementation guide. Agents can search the codebase for implementation details.32- **NOT** a changelog. Old design decisions that have been superseded should be rewritten, not appended. The FDR describes the feature today.3334If you're writing API handler details, framework internals, type definitions, or code snippets in an FDR, you're going too deep. Stop and pull back to behavior and rationale.3536## Directory Structure3738Default layout:3940```text41docs/fdr/42|-- INDEX.md # Index with TOC (read this first)43|-- FDR-001-roles-and-permissions.md # Individual FDR44|-- FDR-002-export-history.md45`-- ...46```4748If a repository already has a feature-decision directory, use that instead. If no FDR directory exists, prefer `docs/fdr/` unless the user asks for a different location.4950## File Naming5152```text53FDR-{NNN}-{kebab-case-slug}.md54```5556- `NNN`: Zero-padded three-digit number, sequential.57- Slug: Short kebab-case summary, not the full title.5859## FDR Template6061```markdown62# FDR-{NNN}: {Feature Name}6364**Status:** Active65**Last reviewed:** {YYYY-MM-DD}6667## Overview6869One paragraph: what the feature is, who uses it, and why it exists.7071## Behavior7273Bullet points describing user-visible behavior. No implementation details.7475## Design Decisions7677Numbered list. Each entry calls out a non-obvious choice and why.7879### 1. {Short decision title}8081**Decision:** What we chose.82**Why:** The reasoning. Cite an ADR if there is one.83**Tradeoff:** What this costs us.8485## Gates8687Capabilities, roles, permission strings, feature flags, plan tiers, rollout rules, or other conditions that gate this feature, with one-line descriptions.88Omit this section for features that aren't gated.8990## Related9192- **ADRs:** ADR-XYZ, ADR-ABC93- **FDRs:** FDR-NNN9495## Open Questions9697Optional. Known design gaps, future considerations, or things we98deliberately haven't decided yet. Delete this section if there's99nothing to say.100```101102### Status values103104- **Active**: feature is in the codebase and supported.105- **Experimental**: feature is in the codebase but unstable.106- **Planned**: feature has an accepted design but is not fully shipped yet.107- **Retired**: feature was removed but the FDR is kept to document the prior design. This should be rare; usually delete instead.108109## Workflow110111### Before doing anything1121131. Read relevant project instructions first. Check for repository guidance such as `AGENTS.md`, `CLAUDE.md`, `.agents/`, `.codex/`, or documentation notes that mention FDRs, ADRs, permissions, roles, feature flags, plans, or product documentation.1142. Locate the FDR directory. Check for `docs/fdr/INDEX.md` first, then search for `FDR-*.md` if needed.1153. Read the FDR index to see the current list of records.1164. Only read individual FDR files if relevant to the current task.1175. If ADRs are referenced, locate the repository's ADR index before resolving citations.1186. Identify project-specific gate sources before validating gates. Search for permission, role, plan, entitlement, feature-flag, rollout, or capability registries in the current repository instead of assuming a fixed file path.119120### Creating a new FDR1211221. Read the FDR index to determine the next available number.1232. Use the template above; fill in every required section.1243. Set **Last reviewed** to today's date.1254. Add the new entry to the FDR index.1265. Cross-reference: if the FDR cites an ADR, the ADR doesn't need to be updated. Citations flow one direction: FDR to ADR.1276. **Sibling check**: for each ADR you cite, skim other FDRs that already cite the same ADR. They're likely related to yours and worth listing in your `Related -> FDRs` line.1287. If no FDR structure exists yet, confirm the directory, numbering scheme, and initial scope with the user before creating files.129130### Updating an FDR1311321. Read the FDR.1332. Make targeted edits. Don't append "Update: ..." notes; rewrite the affected section so the doc describes the feature today.1343. Bump **Last reviewed** to today's date.1354. If the title changed, update the FDR index.1365. If related FDRs become stale because of the change, update their `Related` entries too.137138### Retiring an FDR139140When a feature is removed:141142- **Default:** Delete the FDR. Remove the entry from the index. Git history preserves it if anyone needs to look back.143- **Exception:** Set status to `Retired` and keep it only if the prior design is notable and likely to inform future work, such as a system that was deliberately rolled back and might be reconsidered. Add a top-level note explaining why it was retired.144145## Writing Style146147- **Behavior section: bullet points, short paragraphs.** No code blocks. Describe what users see and experience.148- **Design Decisions: numbered, with explicit Why and Tradeoff.** Each entry should be defensible to a future maintainer who didn't live through the original conversation.149- **Mention gates that shape the feature.** Permissions, roles, plan tiers, feature flags, or rollout constraints are part of feature design. Don't describe how the checks are implemented.150- **Cite ADRs by number** when a design decision is downstream of an architectural choice. Don't restate the ADR; just point to it.151- **Omit sections that don't add value.** A simple feature might just need Overview and Behavior. Don't pad.152- **Prefer stable product language over implementation language.** Use user roles and visible outcomes, not class names, package names, or request/response shapes.153- **Rewrite stale content in place.** Avoid "Previously..." sections unless the prior behavior is still needed to explain compatibility or migration.154155## How To Run156157### Mode 1: Audit All FDRs (default)158159When invoked without arguments, audit every FDR in the FDR directory against the codebase.160161### Mode 2: Audit One FDR162163When invoked with a slug, title fragment, or FDR number, audit only that FDR.164165### Mode 3: Create a New FDR166167When invoked with `new <feature-slug>` such as `new export-history`, research the feature and draft a new FDR. Always ask the user to confirm the slug, number, and scope before writing.168169## Audit Process170171For each FDR being audited:1721731. **Read the FDR** in full.1742. **Verify each claim** against the codebase and adjacent documentation:175 - Gates: do the referenced permissions, roles, plan tiers, feature flags, or rollout conditions exist in the codebase, configuration, or product documentation?176 - Gate sources: did you first identify the repository's actual registries or conventions for these gates?177 - Behavioral claims: does the code actually work this way?178 - Design decisions: are the stated rationales still accurate? Has the implementation drifted?179 - Related ADRs/FDRs: do the cited records still exist and still apply?1803. **Return a structured report** with:181 - **Verified:** claims confirmed by code or documentation.182 - **Discrepancies:** claims that contradict the implementation.183 - **Stale claims:** behaviors or decisions that no longer apply.184 - **Missing:** significant user-facing behavior the FDR doesn't mention.185186When auditing multiple FDRs and subagents are available, run audits in parallel. If subagents are not available, audit sequentially and keep notes per FDR.187188## After Auditing1891901. Present a summary: which FDRs are clean, which need updates.1912. For each discrepancy, propose a concrete edit.1923. Only apply updates with user approval unless the user explicitly asked you to update the FDRs.1934. If docs were added, removed, renumbered, or retitled, update the FDR index.194195## Verification Checklist196197When auditing or creating an FDR, verify:198199- [ ] Relevant project instructions and documentation conventions were checked first.200- [ ] The FDR directory and numbering match the repository's existing convention.201- [ ] The repository's gate sources or naming conventions were identified before validating gates.202- [ ] All referenced gates exist in the codebase, configuration, or product documentation.203- [ ] Gate names use the repository's established naming style.204- [ ] User-facing behaviors match the code.205- [ ] Design decisions still reflect the current implementation.206- [ ] Cited ADRs and FDRs exist and are relevant.207- [ ] The FDR index lists this FDR with the correct title, status, and review date.208- [ ] The FDR contains no unnecessary implementation details.209210## TOC Format211212The FDR index should use a markdown table:213214```markdown215| # | Feature | Status | Last reviewed |216|---|---------|--------|---------------|217| [FDR-001](FDR-001-slug.md) | Title of the feature | Active | 2026-05-19 |218```